Update documentation.
- Convert http to https, provide archive link when possible. - Made CPU-JIT.png more readable on dark themes; Added a white background so there isn't black text on a black background.
This commit is contained in:
parent
3beb9093ac
commit
896ac4a682
|
@ -1,5 +1,5 @@
|
||||||
<!--
|
<!--
|
||||||
# IF YOU HAVE A QUESTION THAT ISN'T A BUG REPORT, GO TO http://reddit.com/r/xenia
|
# IF YOU HAVE A QUESTION THAT ISN'T A BUG REPORT, GO TO https://reddit.com/r/xenia
|
||||||
#
|
#
|
||||||
# DO NOT CREATE ISSUES ABOUT SPECIFIC GAMES IN THIS REPOSITORY!
|
# DO NOT CREATE ISSUES ABOUT SPECIFIC GAMES IN THIS REPOSITORY!
|
||||||
# a game specific issue would be e.g. "Game X crashes after you hit a character a certain way"
|
# a game specific issue would be e.g. "Game X crashes after you hit a character a certain way"
|
||||||
|
|
16
README.md
16
README.md
|
@ -2,11 +2,11 @@ Xenia - Xbox 360 Emulator Research Project
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
Xenia is an experimental emulator for the Xbox 360. For more information see the
|
Xenia is an experimental emulator for the Xbox 360. For more information see the
|
||||||
[main xenia website](http://xenia.jp/).
|
[main xenia website](https://xenia.jp/).
|
||||||
|
|
||||||
Come chat with us about **emulator-related topics** on [Discord](https://discord.gg/Q9mxZf9).
|
Come chat with us about **emulator-related topics** on [Discord](https://discord.gg/Q9mxZf9).
|
||||||
For developer chat join `#dev` but stay on topic. Lurking is fine.
|
For developer chat join `#dev` but stay on topic. Lurking is fine.
|
||||||
Please check the [frequently asked questions](http://xenia.jp/faq/) page before
|
Please check the [frequently asked questions](https://xenia.jp/faq/) page before
|
||||||
asking questions. We've got jobs/lives/etc, so don't expect instant answers.
|
asking questions. We've got jobs/lives/etc, so don't expect instant answers.
|
||||||
|
|
||||||
Discussing illegal activities will get you banned. No warnings.
|
Discussing illegal activities will get you banned. No warnings.
|
||||||
|
@ -35,7 +35,7 @@ legally purchased devices and games and information made public on the internet
|
||||||
|
|
||||||
Windows 8.1+ with Python 3.4 and [Visual Studio 2017](https://www.visualstudio.com/downloads/) and the Windows SDKs installed:
|
Windows 8.1+ with Python 3.4 and [Visual Studio 2017](https://www.visualstudio.com/downloads/) and the Windows SDKs installed:
|
||||||
|
|
||||||
> git clone https://github.com/benvanik/xenia.git
|
> git clone https://github.com/xenia-project/xenia.git
|
||||||
> cd xenia
|
> cd xenia
|
||||||
> xb setup
|
> xb setup
|
||||||
|
|
||||||
|
@ -76,16 +76,16 @@ For general rules and guidelines please see [CONTRIBUTING.md](.github/CONTRIBUTI
|
||||||
Fixes and optimizations are always welcome (please!), but in addition to
|
Fixes and optimizations are always welcome (please!), but in addition to
|
||||||
that there are some major work areas still untouched:
|
that there are some major work areas still untouched:
|
||||||
|
|
||||||
* Help work through missing functionality/bugs in game [compat](https://github.com/benvanik/xenia/issues?labels=compat)
|
* Help work through missing functionality/bugs in game [compat](https://github.com/xenia-project/xenia/issues?labels=compat)
|
||||||
* Add input drivers for [PS4 controllers](https://github.com/benvanik/xenia/issues/60) (or anything else)
|
* Add input drivers for [PS4 controllers](https://github.com/xenia-project/xenia/issues/60) (or anything else)
|
||||||
* Skilled with Linux? A strong contributor is needed to [help with porting](https://github.com/benvanik/xenia/labels/cross%20platform)
|
* Skilled with Linux? A strong contributor is needed to [help with porting](https://github.com/xenia-project/xenia/labels/cross%20platform)
|
||||||
|
|
||||||
See more projects [good for contributors](https://github.com/benvanik/xenia/labels/good%20first%20issue). It's a good idea to ask on Discord/the bugs before beginning work
|
See more projects [good for contributors](https://github.com/xenia-project/xenia/labels/good%20first%20issue). It's a good idea to ask on Discord/the bugs before beginning work
|
||||||
on something.
|
on something.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
For more see the main [frequently asked questions](http://xenia.jp/faq/) page.
|
For more see the main [frequently asked questions](https://xenia.jp/faq/) page.
|
||||||
|
|
||||||
### Can I get an exe?
|
### Can I get an exe?
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ video drivers for your card.
|
||||||
* Visual Studio 2017
|
* Visual Studio 2017
|
||||||
* Windows Universal CRT SDK
|
* Windows Universal CRT SDK
|
||||||
* [Python 3.4+](https://www.python.org/downloads/)
|
* [Python 3.4+](https://www.python.org/downloads/)
|
||||||
* You will also need the [Windows 8.1 SDK](http://msdn.microsoft.com/en-us/windows/desktop/bg162891)
|
* You will also need the [Windows 8.1 SDK](https://msdn.microsoft.com/en-us/windows/desktop/bg162891)
|
||||||
* (for VS2017 just click the Windows 8.1 SDK option in the Individual Components section in the Visual Studio Installer)
|
* (for VS2017 just click the Windows 8.1 SDK option in the Individual Components section in the Visual Studio Installer)
|
||||||
|
|
||||||
Ensure Python is in your PATH.
|
Ensure Python is in your PATH.
|
||||||
|
@ -41,7 +41,7 @@ Linux support is extremely experimental and presently incomplete.
|
||||||
The build script uses LLVM/Clang 3.8. GCC should also work, but is not easily
|
The build script uses LLVM/Clang 3.8. GCC should also work, but is not easily
|
||||||
swappable right now.
|
swappable right now.
|
||||||
|
|
||||||
[CodeLite](http://codelite.org) is the IDE of choice and `xb premake` will spit
|
[CodeLite](https://codelite.org) is the IDE of choice and `xb premake` will spit
|
||||||
out files for that. Make also works via `xb build`.
|
out files for that. Make also works via `xb build`.
|
||||||
|
|
||||||
To get the latest Clang on an ubuntu system:
|
To get the latest Clang on an ubuntu system:
|
||||||
|
|
14
docs/cpu.md
14
docs/cpu.md
|
@ -123,16 +123,16 @@ The CPU is largely similar to the PPC part in the PS3, so Cell documents
|
||||||
often line up for the core instructions. The 360 adds some additional AltiVec
|
often line up for the core instructions. The 360 adds some additional AltiVec
|
||||||
instructions, though, which are only documented in a few places (like the gcc source code, etc).
|
instructions, though, which are only documented in a few places (like the gcc source code, etc).
|
||||||
|
|
||||||
* [Free60 Info](http://www.free60.org/Xenon_\(CPU\))
|
* [Free60 Info](https://free60project.github.io/wiki/Xenon_(CPU))
|
||||||
* [Power ISA docs](https://www.power.org/wp-content/uploads/2012/07/PowerISA_V2.06B_V2_PUBLIC.pdf) (aka 'PowerISA')
|
* [Power ISA docs](https://web.archive.org/web/20140603115759/https://www.power.org/wp-content/uploads/2012/07/PowerISA_V2.06B_V2_PUBLIC.pdf) (aka 'PowerISA')
|
||||||
* [PowerPC Programming Environments Manual](https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/F7E732FF811F783187256FDD004D3797/$file/pem_64bit_v3.0.2005jul15.pdf) (aka 'pem_64')
|
* [PowerPC Programming Environments Manual](https://web.archive.org/web/20141028181028/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/F7E732FF811F783187256FDD004D3797/$file/pem_64bit_v3.0.2005jul15.pdf) (aka 'pem_64')
|
||||||
* [PowerPC Vector PEM](https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf)
|
* [PowerPC Vector PEM](https://web.archive.org/web/20130502201029/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf)
|
||||||
* [AltiVec PEM](http://cache.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf)
|
* [AltiVec PEM](https://web.archive.org/web/20151110180336/https://cache.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf)
|
||||||
* [VMX128 Opcodes](http://biallas.net/doc/vmx128/vmx128.txt)
|
* [VMX128 Opcodes](http://biallas.net/doc/vmx128/vmx128.txt)
|
||||||
* [AltiVec Decoding](https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp)
|
* [AltiVec Decoding](https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp)
|
||||||
|
|
||||||
### x64
|
### x64
|
||||||
|
|
||||||
* [Intel Manuals](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)
|
* [Intel Manuals](https://software.intel.com/en-us/articles/intel-sdm)
|
||||||
* [Combined Intel Manuals](http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)
|
* [Combined Intel Manuals](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)
|
||||||
* [Apple AltiVec/SSE Migration Guide](https://developer.apple.com/legacy/library/documentation/Performance/Conceptual/Accelerate_sse_migration/Accelerate_sse_migration.pdf)
|
* [Apple AltiVec/SSE Migration Guide](https://developer.apple.com/legacy/library/documentation/Performance/Conceptual/Accelerate_sse_migration/Accelerate_sse_migration.pdf)
|
||||||
|
|
|
@ -121,6 +121,6 @@ PM4 commands documented at [src/xenia/gpu/xenos.h](../src/xenia/gpu/xenos.h#L521
|
||||||
|
|
||||||
### Shaders
|
### Shaders
|
||||||
|
|
||||||
* [LLVM R600 Tables](http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/R600Instructions.td)
|
* [LLVM R600 Tables](https://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/R600Instructions.td)
|
||||||
** The opcode formats don't match, but the name->psuedo code is correct.
|
** The opcode formats don't match, but the name->psuedo code is correct.
|
||||||
* [xemit](https://github.com/gligli/libxemit/blob/master/xemitops.c)
|
* [xemit](https://github.com/gligli/libxemit/blob/master/xemitops.c)
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 24 KiB |
|
@ -58,13 +58,13 @@ think about tabs and wrapping and such.
|
||||||
|
|
||||||
To use the `xb format` auto-formatter, you need to have a `clang-format` on your
|
To use the `xb format` auto-formatter, you need to have a `clang-format` on your
|
||||||
PATH. If you're on Windows you can do this by installing an LLVM binary package
|
PATH. If you're on Windows you can do this by installing an LLVM binary package
|
||||||
from [the LLVM downloads page](http://llvm.org/releases/download.html). If you
|
from [the LLVM downloads page](https://llvm.org/releases/download.html). If you
|
||||||
install it to the default location the `xb format` command will find it
|
install it to the default location the `xb format` command will find it
|
||||||
automatically even if you don't choose to put all of LLVM onto your PATH.
|
automatically even if you don't choose to put all of LLVM onto your PATH.
|
||||||
|
|
||||||
#### Visual Studio
|
#### Visual Studio
|
||||||
|
|
||||||
Grab the official [experimental Visual Studio plugin](http://llvm.org/builds/).
|
Grab the official [experimental Visual Studio plugin](https://llvm.org/builds/).
|
||||||
To switch to the Google style go Tools -> Options -> LLVM/Clang -> ClangFormat
|
To switch to the Google style go Tools -> Options -> LLVM/Clang -> ClangFormat
|
||||||
and set Style to Google. Then use ctrl-r/ctrl-f to trigger the formatting.
|
and set Style to Google. Then use ctrl-r/ctrl-f to trigger the formatting.
|
||||||
Unfortunately it only does the cursor by default, so you'll have to select the
|
Unfortunately it only does the cursor by default, so you'll have to select the
|
||||||
|
@ -74,7 +74,7 @@ If you have a better option, let me know!
|
||||||
|
|
||||||
#### Xcode
|
#### Xcode
|
||||||
|
|
||||||
Install [Alcatraz](http://alcatraz.io/) to get the [ClangFormat](https://github.com/travisjeffery/ClangFormat-Xcode)
|
Install [Alcatraz](https://github.com/alcatraz/Alcatraz) to get the [ClangFormat](https://github.com/travisjeffery/ClangFormat-Xcode)
|
||||||
package. Set it to use the Google style and format on save. Never think about
|
package. Set it to use the Google style and format on save. Never think about
|
||||||
tabs or linefeeds or whatever again.
|
tabs or linefeeds or whatever again.
|
||||||
|
|
||||||
|
|
|
@ -260,7 +260,7 @@ bool EmulatorWindow::Initialize() {
|
||||||
std::bind(&EmulatorWindow::ShowHelpWebsite, this)));
|
std::bind(&EmulatorWindow::ShowHelpWebsite, this)));
|
||||||
help_menu->AddChild(MenuItem::Create(
|
help_menu->AddChild(MenuItem::Create(
|
||||||
MenuItem::Type::kString, L"&About...",
|
MenuItem::Type::kString, L"&About...",
|
||||||
[this]() { LaunchBrowser("http://xenia.jp/about/"); }));
|
[this]() { LaunchBrowser("https://xenia.jp/about/"); }));
|
||||||
}
|
}
|
||||||
main_menu->AddChild(std::move(help_menu));
|
main_menu->AddChild(std::move(help_menu));
|
||||||
|
|
||||||
|
@ -384,7 +384,7 @@ void EmulatorWindow::ToggleFullscreen() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmulatorWindow::ShowHelpWebsite() { LaunchBrowser("http://xenia.jp"); }
|
void EmulatorWindow::ShowHelpWebsite() { LaunchBrowser("https://xenia.jp"); }
|
||||||
|
|
||||||
void EmulatorWindow::UpdateTitle() {
|
void EmulatorWindow::UpdateTitle() {
|
||||||
std::wstring title(base_title_);
|
std::wstring title(base_title_);
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
// Helpful resources:
|
// Helpful resources:
|
||||||
// https://github.com/koolkdev/libertyv/blob/master/libav_wrapper/xma2dec.c
|
// https://github.com/koolkdev/libertyv/blob/master/libav_wrapper/xma2dec.c
|
||||||
// http://hcs64.com/mboard/forum.php?showthread=14818
|
// https://hcs64.com/mboard/forum.php?showthread=14818
|
||||||
// https://github.com/hrydgard/minidx9/blob/master/Include/xma2defs.h
|
// https://github.com/hrydgard/minidx9/blob/master/Include/xma2defs.h
|
||||||
|
|
||||||
// Forward declarations
|
// Forward declarations
|
||||||
|
@ -41,7 +41,7 @@ namespace apu {
|
||||||
// We load and swap the whole thing to splat here so that we can
|
// We load and swap the whole thing to splat here so that we can
|
||||||
// use bitfields.
|
// use bitfields.
|
||||||
// This could be important:
|
// This could be important:
|
||||||
// http://www.fmod.org/questions/question/forum-15859
|
// https://www.fmod.org/questions/question/forum-15859
|
||||||
// Appears to be dumped in order (for the most part)
|
// Appears to be dumped in order (for the most part)
|
||||||
|
|
||||||
struct XMA_CONTEXT_DATA {
|
struct XMA_CONTEXT_DATA {
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
|
||||||
// These functions are modeled off of the Apple OSAtomic routines
|
// These functions are modeled off of the Apple OSAtomic routines
|
||||||
// http://developer.apple.com/library/mac/#documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/
|
// https://developer.apple.com/documentation/kernel/osatomic_h (?)
|
||||||
|
// Original link (dead): https://developer.apple.com/library/mac/#documentation/DriversKernelHardware/Reference/libkern_ref/OSAtomic_h/
|
||||||
|
|
||||||
#if XE_PLATFORM_MAC
|
#if XE_PLATFORM_MAC
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,8 @@ LONG CALLBACK ExceptionHandlerCallback(PEXCEPTION_POINTERS ex_info) {
|
||||||
std::memcpy(thread_context.xmm_registers, &ex_info->ContextRecord->Xmm0,
|
std::memcpy(thread_context.xmm_registers, &ex_info->ContextRecord->Xmm0,
|
||||||
sizeof(thread_context.xmm_registers));
|
sizeof(thread_context.xmm_registers));
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms679331(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/ms679331(v=vs.85).aspx
|
||||||
// http://msdn.microsoft.com/en-us/library/aa363082(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/aa363082(v=vs.85).aspx
|
||||||
Exception ex;
|
Exception ex;
|
||||||
switch (ex_info->ExceptionRecord->ExceptionCode) {
|
switch (ex_info->ExceptionRecord->ExceptionCode) {
|
||||||
case STATUS_ILLEGAL_INSTRUCTION:
|
case STATUS_ILLEGAL_INSTRUCTION:
|
||||||
|
|
|
@ -15,9 +15,13 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
|
||||||
// TODO(benvanik): fancy AVX versions.
|
// TODO(benvanik): fancy AVX versions.
|
||||||
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/cb32b70b79f430456208a2cd521d028e0ece5d5b/entry/volk/kernels/volk/volk_16u_byteswap.h
|
// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_16u_byteswap.h
|
||||||
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/f2bc76cc65ffba51a141950f98e75364e49df874/entry/volk/kernels/volk/volk_32u_byteswap.h
|
// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_32u_byteswap.h
|
||||||
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/2c4c371885c31222362f70a1cd714415d1398021/entry/volk/kernels/volk/volk_64u_byteswap.h
|
// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_64u_byteswap.h
|
||||||
|
// Original links:
|
||||||
|
// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/cb32b70b79f430456208a2cd521d028e0ece5d5b/entry/volk/kernels/volk/volk_16u_byteswap.h
|
||||||
|
// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/f2bc76cc65ffba51a141950f98e75364e49df874/entry/volk/kernels/volk/volk_32u_byteswap.h
|
||||||
|
// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/2c4c371885c31222362f70a1cd714415d1398021/entry/volk/kernels/volk/volk_64u_byteswap.h
|
||||||
|
|
||||||
void copy_128_aligned(void* dest, const void* src, size_t count) {
|
void copy_128_aligned(void* dest, const void* src, size_t count) {
|
||||||
std::memcpy(dest, src, count * 16);
|
std::memcpy(dest, src, count * 16);
|
||||||
|
|
|
@ -19,7 +19,8 @@
|
||||||
// NOTE: ordering matters here as sometimes multiple flags are defined on
|
// NOTE: ordering matters here as sometimes multiple flags are defined on
|
||||||
// certain platforms.
|
// certain platforms.
|
||||||
//
|
//
|
||||||
// Great resource on predefined macros: http://predef.sourceforge.net/preos.html
|
// Great resource on predefined macros: https://sourceforge.net/p/predef/wiki/OperatingSystems/
|
||||||
|
// Original link: https://predef.sourceforge.net/preos.html
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
|
|
|
@ -114,7 +114,7 @@ void Profiler::ThreadEnter(const char* name) {
|
||||||
void Profiler::ThreadExit() { MicroProfileOnThreadExit(); }
|
void Profiler::ThreadExit() { MicroProfileOnThreadExit(); }
|
||||||
|
|
||||||
bool Profiler::OnKeyDown(int key_code) {
|
bool Profiler::OnKeyDown(int key_code) {
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
|
||||||
switch (key_code) {
|
switch (key_code) {
|
||||||
case VK_OEM_3: // `
|
case VK_OEM_3: // `
|
||||||
MicroProfileTogglePause();
|
MicroProfileTogglePause();
|
||||||
|
|
|
@ -29,7 +29,7 @@ uint32_t current_thread_system_id() {
|
||||||
return static_cast<uint32_t>(GetCurrentThreadId());
|
return static_cast<uint32_t>(GetCurrentThreadId());
|
||||||
}
|
}
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
// https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
|
||||||
#pragma pack(push, 8)
|
#pragma pack(push, 8)
|
||||||
struct THREADNAME_INFO {
|
struct THREADNAME_INFO {
|
||||||
DWORD dwType; // Must be 0x1000.
|
DWORD dwType; // Must be 0x1000.
|
||||||
|
|
|
@ -187,7 +187,7 @@ uint64_t ReadCapstoneReg(X64Context* context, x86_reg reg) {
|
||||||
#define X86_EFLAGS_SF 0x00000080 // Sign Flag
|
#define X86_EFLAGS_SF 0x00000080 // Sign Flag
|
||||||
#define X86_EFLAGS_OF 0x00000800 // Overflow Flag
|
#define X86_EFLAGS_OF 0x00000800 // Overflow Flag
|
||||||
bool TestCapstoneEflags(uint32_t eflags, uint32_t insn) {
|
bool TestCapstoneEflags(uint32_t eflags, uint32_t insn) {
|
||||||
// http://www.felixcloutier.com/x86/Jcc.html
|
// https://www.felixcloutier.com/x86/Jcc.html
|
||||||
switch (insn) {
|
switch (insn) {
|
||||||
case X86_INS_JAE:
|
case X86_INS_JAE:
|
||||||
// CF=0 && ZF=0
|
// CF=0 && ZF=0
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace cpu {
|
||||||
namespace backend {
|
namespace backend {
|
||||||
namespace x64 {
|
namespace x64 {
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ssa62fwe.aspx
|
// https://msdn.microsoft.com/en-us/library/ssa62fwe.aspx
|
||||||
typedef enum _UNWIND_OP_CODES {
|
typedef enum _UNWIND_OP_CODES {
|
||||||
UWOP_PUSH_NONVOL = 0, /* info == register number */
|
UWOP_PUSH_NONVOL = 0, /* info == register number */
|
||||||
UWOP_ALLOC_LARGE, /* no info, alloc size in next 2 slots */
|
UWOP_ALLOC_LARGE, /* no info, alloc size in next 2 slots */
|
||||||
|
@ -242,7 +242,7 @@ void Win32X64CodeCache::InitializeUnwindEntry(uint8_t* unwind_entry_address,
|
||||||
UNWIND_CODE* unwind_code = nullptr;
|
UNWIND_CODE* unwind_code = nullptr;
|
||||||
|
|
||||||
if (!stack_size) {
|
if (!stack_size) {
|
||||||
// http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
// https://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
||||||
unwind_info->Version = 1;
|
unwind_info->Version = 1;
|
||||||
unwind_info->Flags = 0;
|
unwind_info->Flags = 0;
|
||||||
unwind_info->SizeOfProlog = 0;
|
unwind_info->SizeOfProlog = 0;
|
||||||
|
@ -252,7 +252,7 @@ void Win32X64CodeCache::InitializeUnwindEntry(uint8_t* unwind_entry_address,
|
||||||
} else if (stack_size <= 128) {
|
} else if (stack_size <= 128) {
|
||||||
uint8_t prolog_size = 4;
|
uint8_t prolog_size = 4;
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
// https://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
||||||
unwind_info->Version = 1;
|
unwind_info->Version = 1;
|
||||||
unwind_info->Flags = 0;
|
unwind_info->Flags = 0;
|
||||||
unwind_info->SizeOfProlog = prolog_size;
|
unwind_info->SizeOfProlog = prolog_size;
|
||||||
|
@ -260,7 +260,7 @@ void Win32X64CodeCache::InitializeUnwindEntry(uint8_t* unwind_entry_address,
|
||||||
unwind_info->FrameRegister = 0;
|
unwind_info->FrameRegister = 0;
|
||||||
unwind_info->FrameOffset = 0;
|
unwind_info->FrameOffset = 0;
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ck9asaa9.aspx
|
// https://msdn.microsoft.com/en-us/library/ck9asaa9.aspx
|
||||||
unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];
|
unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];
|
||||||
unwind_code->CodeOffset =
|
unwind_code->CodeOffset =
|
||||||
14; // end of instruction + 1 == offset of next instruction
|
14; // end of instruction + 1 == offset of next instruction
|
||||||
|
@ -270,7 +270,7 @@ void Win32X64CodeCache::InitializeUnwindEntry(uint8_t* unwind_entry_address,
|
||||||
// TODO(benvanik): take as parameters?
|
// TODO(benvanik): take as parameters?
|
||||||
uint8_t prolog_size = 7;
|
uint8_t prolog_size = 7;
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
// https://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
|
||||||
unwind_info->Version = 1;
|
unwind_info->Version = 1;
|
||||||
unwind_info->Flags = 0;
|
unwind_info->Flags = 0;
|
||||||
unwind_info->SizeOfProlog = prolog_size;
|
unwind_info->SizeOfProlog = prolog_size;
|
||||||
|
@ -278,7 +278,7 @@ void Win32X64CodeCache::InitializeUnwindEntry(uint8_t* unwind_entry_address,
|
||||||
unwind_info->FrameRegister = 0;
|
unwind_info->FrameRegister = 0;
|
||||||
unwind_info->FrameOffset = 0;
|
unwind_info->FrameOffset = 0;
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ck9asaa9.aspx
|
// https://msdn.microsoft.com/en-us/library/ck9asaa9.aspx
|
||||||
unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];
|
unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];
|
||||||
unwind_code->CodeOffset =
|
unwind_code->CodeOffset =
|
||||||
7; // end of instruction + 1 == offset of next instruction
|
7; // end of instruction + 1 == offset of next instruction
|
||||||
|
|
|
@ -82,7 +82,7 @@ X64Emitter::X64Emitter(X64Backend* backend, XbyakAllocator* allocator)
|
||||||
if (!cpu_.has(Xbyak::util::Cpu::tAVX)) {
|
if (!cpu_.has(Xbyak::util::Cpu::tAVX)) {
|
||||||
xe::FatalError(
|
xe::FatalError(
|
||||||
"Your CPU is too old to support Xenia. See the FAQ for system "
|
"Your CPU is too old to support Xenia. See the FAQ for system "
|
||||||
"requirements at http://xenia.jp");
|
"requirements at https://xenia.jp");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ bool X64Emitter::Emit(HIRBuilder* builder, size_t* out_stack_size) {
|
||||||
// Function prolog.
|
// Function prolog.
|
||||||
// Must be 16b aligned.
|
// Must be 16b aligned.
|
||||||
// Windows is very strict about the form of this and the epilog:
|
// Windows is very strict about the form of this and the epilog:
|
||||||
// http://msdn.microsoft.com/en-us/library/tawsa7cb.aspx
|
// https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx
|
||||||
// IMPORTANT: any changes to the prolog must be kept in sync with
|
// IMPORTANT: any changes to the prolog must be kept in sync with
|
||||||
// X64CodeCache, which dynamically generates exception information.
|
// X64CodeCache, which dynamically generates exception information.
|
||||||
// Adding or changing anything here must be matched!
|
// Adding or changing anything here must be matched!
|
||||||
|
@ -738,7 +738,7 @@ Xbyak::Address X64Emitter::GetXmmConstPtr(XmmConst id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void X64Emitter::LoadConstantXmm(Xbyak::Xmm dest, const vec128_t& v) {
|
void X64Emitter::LoadConstantXmm(Xbyak::Xmm dest, const vec128_t& v) {
|
||||||
// http://www.agner.org/optimize/optimizing_assembly.pdf
|
// https://www.agner.org/optimize/optimizing_assembly.pdf
|
||||||
// 13.4 Generating constants
|
// 13.4 Generating constants
|
||||||
if (!v.low && !v.high) {
|
if (!v.low && !v.high) {
|
||||||
// 0000...
|
// 0000...
|
||||||
|
|
|
@ -3367,7 +3367,8 @@ EMITTER_ASSOCIATIVE_COMPARE_XX(ULE, setbe, setae);
|
||||||
EMITTER_ASSOCIATIVE_COMPARE_XX(UGT, seta, setb);
|
EMITTER_ASSOCIATIVE_COMPARE_XX(UGT, seta, setb);
|
||||||
EMITTER_ASSOCIATIVE_COMPARE_XX(UGE, setae, setbe);
|
EMITTER_ASSOCIATIVE_COMPARE_XX(UGE, setae, setbe);
|
||||||
|
|
||||||
// http://x86.renejeschke.de/html/file_module_x86_id_288.html
|
// https://web.archive.org/web/20171129015931/https://x86.renejeschke.de/html/file_module_x86_id_288.html
|
||||||
|
// Original link: https://x86.renejeschke.de/html/file_module_x86_id_288.html
|
||||||
#define EMITTER_ASSOCIATIVE_COMPARE_FLT_XX(op, instr) \
|
#define EMITTER_ASSOCIATIVE_COMPARE_FLT_XX(op, instr) \
|
||||||
struct COMPARE_##op##_F32 \
|
struct COMPARE_##op##_F32 \
|
||||||
: Sequence<COMPARE_##op##_F32, \
|
: Sequence<COMPARE_##op##_F32, \
|
||||||
|
@ -3793,7 +3794,7 @@ struct VECTOR_ADD
|
||||||
// If result is smaller than either of the inputs, we've
|
// If result is smaller than either of the inputs, we've
|
||||||
// overflowed (only need to check one input)
|
// overflowed (only need to check one input)
|
||||||
// if (src1 > res) then overflowed
|
// if (src1 > res) then overflowed
|
||||||
// http://locklessinc.com/articles/sat_arithmetic/
|
// https://locklessinc.com/articles/sat_arithmetic/
|
||||||
e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));
|
e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));
|
||||||
e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));
|
e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));
|
||||||
e.vpcmpgtd(e.xmm0, e.xmm2, e.xmm0);
|
e.vpcmpgtd(e.xmm0, e.xmm2, e.xmm0);
|
||||||
|
@ -3804,7 +3805,7 @@ struct VECTOR_ADD
|
||||||
// Overflow results if two inputs are the same sign and the
|
// Overflow results if two inputs are the same sign and the
|
||||||
// result isn't the same sign. if ((s32b)(~(src1 ^ src2) &
|
// result isn't the same sign. if ((s32b)(~(src1 ^ src2) &
|
||||||
// (src1 ^ res)) < 0) then overflowed
|
// (src1 ^ res)) < 0) then overflowed
|
||||||
// http://locklessinc.com/articles/sat_arithmetic/
|
// https://locklessinc.com/articles/sat_arithmetic/
|
||||||
e.vpxor(e.xmm2, src1, src2);
|
e.vpxor(e.xmm2, src1, src2);
|
||||||
e.vpxor(e.xmm3, src1, e.xmm1);
|
e.vpxor(e.xmm3, src1, e.xmm1);
|
||||||
e.vpandn(e.xmm2, e.xmm2, e.xmm3);
|
e.vpandn(e.xmm2, e.xmm2, e.xmm3);
|
||||||
|
@ -3950,7 +3951,7 @@ struct VECTOR_SUB
|
||||||
// If result is greater than either of the inputs, we've
|
// If result is greater than either of the inputs, we've
|
||||||
// underflowed (only need to check one input)
|
// underflowed (only need to check one input)
|
||||||
// if (res > src1) then underflowed
|
// if (res > src1) then underflowed
|
||||||
// http://locklessinc.com/articles/sat_arithmetic/
|
// https://locklessinc.com/articles/sat_arithmetic/
|
||||||
e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));
|
e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));
|
||||||
e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));
|
e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));
|
||||||
e.vpcmpgtd(e.xmm0, e.xmm0, e.xmm2);
|
e.vpcmpgtd(e.xmm0, e.xmm0, e.xmm2);
|
||||||
|
@ -3962,7 +3963,7 @@ struct VECTOR_SUB
|
||||||
// opposite. If signs are opposite and result sign isn't the
|
// opposite. If signs are opposite and result sign isn't the
|
||||||
// same as src1's sign, we've overflowed. if ((s32b)((src1 ^
|
// same as src1's sign, we've overflowed. if ((s32b)((src1 ^
|
||||||
// src2) & (src1 ^ res)) < 0) then overflowed
|
// src2) & (src1 ^ res)) < 0) then overflowed
|
||||||
// http://locklessinc.com/articles/sat_arithmetic/
|
// https://locklessinc.com/articles/sat_arithmetic/
|
||||||
e.vpxor(e.xmm2, src1, src2);
|
e.vpxor(e.xmm2, src1, src2);
|
||||||
e.vpxor(e.xmm3, src1, e.xmm1);
|
e.vpxor(e.xmm3, src1, e.xmm1);
|
||||||
e.vpand(e.xmm2, e.xmm2, e.xmm3);
|
e.vpand(e.xmm2, e.xmm2, e.xmm3);
|
||||||
|
@ -5062,7 +5063,7 @@ EMITTER_OPCODE_TABLE(OPCODE_RECIP, RECIP_F32, RECIP_F64, RECIP_V128);
|
||||||
// OPCODE_POW2
|
// OPCODE_POW2
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// TODO(benvanik): use approx here:
|
// TODO(benvanik): use approx here:
|
||||||
// http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html
|
// https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html
|
||||||
struct POW2_F32 : Sequence<POW2_F32, I<OPCODE_POW2, F32Op, F32Op>> {
|
struct POW2_F32 : Sequence<POW2_F32, I<OPCODE_POW2, F32Op, F32Op>> {
|
||||||
static __m128 EmulatePow2(void*, __m128 src) {
|
static __m128 EmulatePow2(void*, __m128 src) {
|
||||||
float src_value;
|
float src_value;
|
||||||
|
@ -5112,7 +5113,7 @@ EMITTER_OPCODE_TABLE(OPCODE_POW2, POW2_F32, POW2_F64, POW2_V128);
|
||||||
// OPCODE_LOG2
|
// OPCODE_LOG2
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// TODO(benvanik): use approx here:
|
// TODO(benvanik): use approx here:
|
||||||
// http://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html
|
// https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html
|
||||||
// TODO(benvanik): this emulated fn destroys all xmm registers! don't do it!
|
// TODO(benvanik): this emulated fn destroys all xmm registers! don't do it!
|
||||||
struct LOG2_F32 : Sequence<LOG2_F32, I<OPCODE_LOG2, F32Op, F32Op>> {
|
struct LOG2_F32 : Sequence<LOG2_F32, I<OPCODE_LOG2, F32Op, F32Op>> {
|
||||||
static __m128 EmulateLog2(void*, __m128 src) {
|
static __m128 EmulateLog2(void*, __m128 src) {
|
||||||
|
@ -5166,7 +5167,7 @@ struct DOT_PRODUCT_3_V128
|
||||||
: Sequence<DOT_PRODUCT_3_V128,
|
: Sequence<DOT_PRODUCT_3_V128,
|
||||||
I<OPCODE_DOT_PRODUCT_3, F32Op, V128Op, V128Op>> {
|
I<OPCODE_DOT_PRODUCT_3, F32Op, V128Op, V128Op>> {
|
||||||
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||||
// http://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx
|
// https://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx
|
||||||
EmitCommutativeBinaryXmmOp(e, i,
|
EmitCommutativeBinaryXmmOp(e, i,
|
||||||
[](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {
|
[](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {
|
||||||
// TODO(benvanik): apparently this is very slow
|
// TODO(benvanik): apparently this is very slow
|
||||||
|
@ -5184,7 +5185,7 @@ struct DOT_PRODUCT_4_V128
|
||||||
: Sequence<DOT_PRODUCT_4_V128,
|
: Sequence<DOT_PRODUCT_4_V128,
|
||||||
I<OPCODE_DOT_PRODUCT_4, F32Op, V128Op, V128Op>> {
|
I<OPCODE_DOT_PRODUCT_4, F32Op, V128Op, V128Op>> {
|
||||||
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
static void Emit(X64Emitter& e, const EmitArgType& i) {
|
||||||
// http://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx
|
// https://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx
|
||||||
EmitCommutativeBinaryXmmOp(e, i,
|
EmitCommutativeBinaryXmmOp(e, i,
|
||||||
[](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {
|
[](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {
|
||||||
// TODO(benvanik): apparently this is very slow
|
// TODO(benvanik): apparently this is very slow
|
||||||
|
@ -7003,7 +7004,7 @@ struct PACK : Sequence<PACK, I<OPCODE_PACK, V128Op, V128Op, V128Op>> {
|
||||||
}
|
}
|
||||||
static void EmitFLOAT16_2(X64Emitter& e, const EmitArgType& i) {
|
static void EmitFLOAT16_2(X64Emitter& e, const EmitArgType& i) {
|
||||||
assert_true(i.src2.value->IsConstantZero());
|
assert_true(i.src2.value->IsConstantZero());
|
||||||
// http://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx
|
// https://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx
|
||||||
// dest = [(src1.x | src1.y), 0, 0, 0]
|
// dest = [(src1.x | src1.y), 0, 0, 0]
|
||||||
|
|
||||||
Xmm src;
|
Xmm src;
|
||||||
|
@ -7398,10 +7399,10 @@ struct UNPACK : Sequence<UNPACK, I<OPCODE_UNPACK, V128Op, V128Op>> {
|
||||||
// 1 bit sign, 5 bit exponent, 10 bit mantissa
|
// 1 bit sign, 5 bit exponent, 10 bit mantissa
|
||||||
// D3D10 half float format
|
// D3D10 half float format
|
||||||
// TODO(benvanik):
|
// TODO(benvanik):
|
||||||
// http://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx
|
// https://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx
|
||||||
// Use _mm_cvtph_ps -- requires very modern processors (SSE5+)
|
// Use _mm_cvtph_ps -- requires very modern processors (SSE5+)
|
||||||
// Unpacking half floats:
|
// Unpacking half floats:
|
||||||
// http://fgiesen.wordpress.com/2012/03/28/half-to-float-done-quic/
|
// https://fgiesen.wordpress.com/2012/03/28/half-to-float-done-quic/
|
||||||
// Packing half floats: https://gist.github.com/rygorous/2156668
|
// Packing half floats: https://gist.github.com/rygorous/2156668
|
||||||
// Load source, move from tight pack of X16Y16.... to X16...Y16...
|
// Load source, move from tight pack of X16Y16.... to X16...Y16...
|
||||||
// Also zero out the high end.
|
// Also zero out the high end.
|
||||||
|
|
|
@ -489,7 +489,7 @@ int CompareValueUse(const Value::Use* a, const Value::Use* b) {
|
||||||
} // namespace
|
} // namespace
|
||||||
void RegisterAllocationPass::SortUsageList(Value* value) {
|
void RegisterAllocationPass::SortUsageList(Value* value) {
|
||||||
// Modified in-place linked list sort from:
|
// Modified in-place linked list sort from:
|
||||||
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.c
|
// https://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.c
|
||||||
if (!value->use_head) {
|
if (!value->use_head) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ bool TryDecodeMov(const uint8_t* p, DecodedMov* mov) {
|
||||||
}
|
}
|
||||||
if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF1) {
|
if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF1) {
|
||||||
// MOVBE m32, r32 (store)
|
// MOVBE m32, r32 (store)
|
||||||
// http://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html
|
// https://web.archive.org/web/20170629091435/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html
|
||||||
// 44 0f 38 f1 a4 02 00 movbe DWORD PTR [rdx+rax*1+0x0],r12d
|
// 44 0f 38 f1 a4 02 00 movbe DWORD PTR [rdx+rax*1+0x0],r12d
|
||||||
// 42 0f 38 f1 8c 22 00 movbe DWORD PTR [rdx+r12*1+0x0],ecx
|
// 42 0f 38 f1 8c 22 00 movbe DWORD PTR [rdx+r12*1+0x0],ecx
|
||||||
// 0f 38 f1 8c 02 00 00 movbe DWORD PTR [rdx + rax * 1 + 0x0], ecx
|
// 0f 38 f1 8c 02 00 00 movbe DWORD PTR [rdx + rax * 1 + 0x0], ecx
|
||||||
|
@ -325,7 +325,7 @@ bool TryDecodeMov(const uint8_t* p, DecodedMov* mov) {
|
||||||
i += 3;
|
i += 3;
|
||||||
} else if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF0) {
|
} else if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF0) {
|
||||||
// MOVBE r32, m32 (load)
|
// MOVBE r32, m32 (load)
|
||||||
// http://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html
|
// https://web.archive.org/web/20170629091435/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html
|
||||||
// 44 0f 38 f0 a4 02 00 movbe r12d,DWORD PTR [rdx+rax*1+0x0]
|
// 44 0f 38 f0 a4 02 00 movbe r12d,DWORD PTR [rdx+rax*1+0x0]
|
||||||
// 42 0f 38 f0 8c 22 00 movbe ecx,DWORD PTR [rdx+r12*1+0x0]
|
// 42 0f 38 f0 8c 22 00 movbe ecx,DWORD PTR [rdx+r12*1+0x0]
|
||||||
// 46 0f 38 f0 a4 22 00 movbe r12d,DWORD PTR [rdx+r12*1+0x0]
|
// 46 0f 38 f0 a4 22 00 movbe r12d,DWORD PTR [rdx+r12*1+0x0]
|
||||||
|
@ -336,7 +336,7 @@ bool TryDecodeMov(const uint8_t* p, DecodedMov* mov) {
|
||||||
i += 3;
|
i += 3;
|
||||||
} else if (p[i] == 0x89) {
|
} else if (p[i] == 0x89) {
|
||||||
// MOV m32, r32 (store)
|
// MOV m32, r32 (store)
|
||||||
// http://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html
|
// https://web.archive.org/web/20170629072136/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html
|
||||||
// 44 89 24 02 mov DWORD PTR[rdx + rax * 1], r12d
|
// 44 89 24 02 mov DWORD PTR[rdx + rax * 1], r12d
|
||||||
// 42 89 0c 22 mov DWORD PTR[rdx + r12 * 1], ecx
|
// 42 89 0c 22 mov DWORD PTR[rdx + r12 * 1], ecx
|
||||||
// 89 0c 02 mov DWORD PTR[rdx + rax * 1], ecx
|
// 89 0c 02 mov DWORD PTR[rdx + rax * 1], ecx
|
||||||
|
@ -345,7 +345,7 @@ bool TryDecodeMov(const uint8_t* p, DecodedMov* mov) {
|
||||||
++i;
|
++i;
|
||||||
} else if (p[i] == 0x8B) {
|
} else if (p[i] == 0x8B) {
|
||||||
// MOV r32, m32 (load)
|
// MOV r32, m32 (load)
|
||||||
// http://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html
|
// https://web.archive.org/web/20170629072136/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html
|
||||||
// 44 8b 24 02 mov r12d, DWORD PTR[rdx + rax * 1]
|
// 44 8b 24 02 mov r12d, DWORD PTR[rdx + rax * 1]
|
||||||
// 42 8b 0c 22 mov ecx, DWORD PTR[rdx + r12 * 1]
|
// 42 8b 0c 22 mov ecx, DWORD PTR[rdx + r12 * 1]
|
||||||
// 46 8b 24 22 mov r12d, DWORD PTR[rdx + r12 * 1]
|
// 46 8b 24 22 mov r12d, DWORD PTR[rdx + r12 * 1]
|
||||||
|
@ -355,7 +355,7 @@ bool TryDecodeMov(const uint8_t* p, DecodedMov* mov) {
|
||||||
++i;
|
++i;
|
||||||
} else if (p[i] == 0xC7) {
|
} else if (p[i] == 0xC7) {
|
||||||
// MOV m32, simm32
|
// MOV m32, simm32
|
||||||
// http://www.asmpedia.org/index.php?title=MOV
|
// https://web.archive.org/web/20161017042413/https://www.asmpedia.org/index.php?title=MOV
|
||||||
// C7 04 02 02 00 00 00 mov dword ptr [rdx+rax],2
|
// C7 04 02 02 00 00 00 mov dword ptr [rdx+rax],2
|
||||||
mov->is_load = false;
|
mov->is_load = false;
|
||||||
mov->byte_swap = false;
|
mov->byte_swap = false;
|
||||||
|
|
|
@ -31,7 +31,7 @@ Value* CalculateEA_0(PPCHIRBuilder& f, uint32_t ra, uint32_t rb);
|
||||||
// Most of this file comes from:
|
// Most of this file comes from:
|
||||||
// http://biallas.net/doc/vmx128/vmx128.txt
|
// http://biallas.net/doc/vmx128/vmx128.txt
|
||||||
// https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp
|
// https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp
|
||||||
// http://sannybuilder.com/forums/viewtopic.php?id=190
|
// https://sannybuilder.com/forums/viewtopic.php?id=190
|
||||||
|
|
||||||
#define OP(x) ((((uint32_t)(x)) & 0x3f) << 26)
|
#define OP(x) ((((uint32_t)(x)) & 0x3f) << 26)
|
||||||
#define VX128(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x3d0))
|
#define VX128(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x3d0))
|
||||||
|
@ -2068,7 +2068,7 @@ int InstrEmit_vpkd3d128(PPCHIRBuilder& f, const InstrData& i) {
|
||||||
assert_unhandled_case(type);
|
assert_unhandled_case(type);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// http://hlssmod.net/he_code/public/pixelwriter.h
|
// https://hlssmod.net/he_code/public/pixelwriter.h
|
||||||
// control = prev:0123 | new:4567
|
// control = prev:0123 | new:4567
|
||||||
uint32_t control = kIdentityPermuteMask; // original
|
uint32_t control = kIdentityPermuteMask; // original
|
||||||
switch (pack) {
|
switch (pack) {
|
||||||
|
@ -2141,7 +2141,8 @@ int InstrEmit_vpkd3d128(PPCHIRBuilder& f, const InstrData& i) {
|
||||||
|
|
||||||
int InstrEmit_vupkd3d128(PPCHIRBuilder& f, const InstrData& i) {
|
int InstrEmit_vupkd3d128(PPCHIRBuilder& f, const InstrData& i) {
|
||||||
// Can't find many docs on this. Best reference is
|
// Can't find many docs on this. Best reference is
|
||||||
// http://worldcraft.googlecode.com/svn/trunk/src/qylib/math/xmmatrix.inl,
|
// https://code.google.com/archive/p/worldcraft/source/default/source?page=4
|
||||||
|
// (qylib/math/xmmatrix.inl)
|
||||||
// which shows how it's used in some cases. Since it's all intrinsics,
|
// which shows how it's used in some cases. Since it's all intrinsics,
|
||||||
// finding it in code is pretty easy.
|
// finding it in code is pretty easy.
|
||||||
const uint32_t vd = i.VX128_3.VD128l | (i.VX128_3.VD128h << 5);
|
const uint32_t vd = i.VX128_3.VD128l | (i.VX128_3.VD128h << 5);
|
||||||
|
|
|
@ -26,7 +26,7 @@ using xe::cpu::hir::RoundMode;
|
||||||
using xe::cpu::hir::Value;
|
using xe::cpu::hir::Value;
|
||||||
|
|
||||||
// Good source of information:
|
// Good source of information:
|
||||||
// http://mamedev.org/source/src/emu/cpu/powerpc/ppc_ops.c
|
// https://github.com/mamedev/historic-mame/blob/master/src/emu/cpu/powerpc/ppc_ops.c
|
||||||
// The correctness of that code is not reflected here yet -_-
|
// The correctness of that code is not reflected here yet -_-
|
||||||
|
|
||||||
// Enable rounding numbers to single precision as required.
|
// Enable rounding numbers to single precision as required.
|
||||||
|
|
|
@ -347,8 +347,8 @@ void CommandProcessor::MakeCoherent() {
|
||||||
// some way to check for dest coherency (what all the COHER_DEST_BASE_*
|
// some way to check for dest coherency (what all the COHER_DEST_BASE_*
|
||||||
// registers are for).
|
// registers are for).
|
||||||
// Best docs I've found on this are here:
|
// Best docs I've found on this are here:
|
||||||
// http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/10/R6xx_R7xx_3D.pdf
|
// https://web.archive.org/web/20160711162346/https://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/10/R6xx_R7xx_3D.pdf
|
||||||
// http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/src/r6xx_accel.c?id=3f8b6eccd9dba116cc4801e7f80ce21a879c67d2#n454
|
// https://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/src/r6xx_accel.c?id=3f8b6eccd9dba116cc4801e7f80ce21a879c67d2#n454
|
||||||
|
|
||||||
RegisterFile* regs = register_file_;
|
RegisterFile* regs = register_file_;
|
||||||
auto status_host = regs->values[XE_GPU_REG_COHER_STATUS_HOST].u32;
|
auto status_host = regs->values[XE_GPU_REG_COHER_STATUS_HOST].u32;
|
||||||
|
@ -1392,7 +1392,7 @@ bool CommandProcessor::ExecutePacketType3_VIZ_QUERY(RingBuffer* reader,
|
||||||
uint32_t packet,
|
uint32_t packet,
|
||||||
uint32_t count) {
|
uint32_t count) {
|
||||||
// begin/end initiator for viz query extent processing
|
// begin/end initiator for viz query extent processing
|
||||||
// http://www.google.com/patents/US20050195186
|
// https://www.google.com/patents/US20050195186
|
||||||
assert_true(count == 1);
|
assert_true(count == 1);
|
||||||
|
|
||||||
uint32_t dword0 = reader->ReadAndSwap<uint32_t>();
|
uint32_t dword0 = reader->ReadAndSwap<uint32_t>();
|
||||||
|
|
|
@ -131,8 +131,8 @@ struct VertexData {
|
||||||
};
|
};
|
||||||
)");
|
)");
|
||||||
|
|
||||||
// http://www.nvidia.com/object/cube_map_ogl_tutorial.html
|
// https://www.nvidia.com/object/cube_map_ogl_tutorial.html
|
||||||
// http://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf
|
// https://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf
|
||||||
// src0 = Rn.zzxy, src1 = Rn.yxzz
|
// src0 = Rn.zzxy, src1 = Rn.yxzz
|
||||||
// dst.W = FaceId;
|
// dst.W = FaceId;
|
||||||
// dst.Z = 2.0f * MajorAxis;
|
// dst.Z = 2.0f * MajorAxis;
|
||||||
|
|
|
@ -26,8 +26,8 @@ namespace gpu {
|
||||||
// Nvidia Optimus/AMD PowerXpress support.
|
// Nvidia Optimus/AMD PowerXpress support.
|
||||||
// These exports force the process to trigger the discrete GPU in multi-GPU
|
// These exports force the process to trigger the discrete GPU in multi-GPU
|
||||||
// systems.
|
// systems.
|
||||||
// http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf
|
// https://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf
|
||||||
// http://stackoverflow.com/questions/17458803/amd-equivalent-to-nvoptimusenablement
|
// https://stackoverflow.com/questions/17458803/amd-equivalent-to-nvoptimusenablement
|
||||||
#if XE_PLATFORM_WIN32
|
#if XE_PLATFORM_WIN32
|
||||||
extern "C" {
|
extern "C" {
|
||||||
__declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;
|
__declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;
|
||||||
|
@ -74,7 +74,7 @@ X_STATUS GraphicsSystem::Setup(cpu::Processor* processor,
|
||||||
"Ensure you have the latest drivers for your GPU and "
|
"Ensure you have the latest drivers for your GPU and "
|
||||||
"that it supports Vulkan.\n"
|
"that it supports Vulkan.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"See http://xenia.jp/faq/ for more information and a list of "
|
"See https://xenia.jp/faq/ for more information and a list of "
|
||||||
"supported GPUs.");
|
"supported GPUs.");
|
||||||
return X_STATUS_UNSUCCESSFUL;
|
return X_STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ using namespace ucode;
|
||||||
// https://github.com/freedreno/freedreno/blob/master/util/disasm-a2xx.c
|
// https://github.com/freedreno/freedreno/blob/master/util/disasm-a2xx.c
|
||||||
//
|
//
|
||||||
// Lots of naming comes from the disassembly spit out by the XNA GS compiler
|
// Lots of naming comes from the disassembly spit out by the XNA GS compiler
|
||||||
// and dumps of d3dcompiler and games: http://pastebin.com/i4kAv7bB
|
// and dumps of d3dcompiler and games: https://pastebin.com/i4kAv7bB
|
||||||
|
|
||||||
ShaderTranslator::ShaderTranslator() = default;
|
ShaderTranslator::ShaderTranslator() = default;
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ void CopySwapBlock(Endian endian, void* output, const void* input,
|
||||||
|
|
||||||
void ConvertTexelCTX1ToR8G8(Endian endian, void* output, const void* input,
|
void ConvertTexelCTX1ToR8G8(Endian endian, void* output, const void* input,
|
||||||
size_t length) {
|
size_t length) {
|
||||||
// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
// https://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
||||||
union {
|
union {
|
||||||
uint8_t data[8];
|
uint8_t data[8];
|
||||||
struct {
|
struct {
|
||||||
|
|
|
@ -26,7 +26,7 @@ using namespace xe::gpu::xenos;
|
||||||
|
|
||||||
bool TextureInfo::Prepare(const xe_gpu_texture_fetch_t& fetch,
|
bool TextureInfo::Prepare(const xe_gpu_texture_fetch_t& fetch,
|
||||||
TextureInfo* out_info) {
|
TextureInfo* out_info) {
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/cc308051(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/cc308051(v=vs.85).aspx
|
||||||
// a2xx_sq_surfaceformat
|
// a2xx_sq_surfaceformat
|
||||||
|
|
||||||
std::memset(out_info, 0, sizeof(TextureInfo));
|
std::memset(out_info, 0, sizeof(TextureInfo));
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "xenia/gpu/xenos.h"
|
#include "xenia/gpu/xenos.h"
|
||||||
|
|
||||||
// Closest AMD doc:
|
// Closest AMD doc:
|
||||||
// http://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf
|
// https://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf
|
||||||
// Microcode format differs, but most fields/enums are the same.
|
// Microcode format differs, but most fields/enums are the same.
|
||||||
|
|
||||||
// This code comes from the freedreno project:
|
// This code comes from the freedreno project:
|
||||||
|
@ -701,7 +701,7 @@ static_assert_size(TextureFetchInstruction, 12);
|
||||||
// R600 docs that have a near 1:1 with the instructions available in the xenos
|
// R600 docs that have a near 1:1 with the instructions available in the xenos
|
||||||
// GPU. Some of the behavior has been experimentally verified. Some has been
|
// GPU. Some of the behavior has been experimentally verified. Some has been
|
||||||
// guessed.
|
// guessed.
|
||||||
// Docs: http://www.x.org/docs/AMD/old/r600isa.pdf
|
// Docs: https://www.x.org/docs/AMD/old/r600isa.pdf
|
||||||
//
|
//
|
||||||
// Conventions:
|
// Conventions:
|
||||||
// - All temporary registers are vec4s.
|
// - All temporary registers are vec4s.
|
||||||
|
|
|
@ -660,7 +660,7 @@ bool PipelineCache::SetDynamicState(VkCommandBuffer command_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Whether each of the viewport settings are enabled.
|
// Whether each of the viewport settings are enabled.
|
||||||
// http://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf
|
// https://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf
|
||||||
bool vport_xscale_enable = (regs.pa_cl_vte_cntl & (1 << 0)) > 0;
|
bool vport_xscale_enable = (regs.pa_cl_vte_cntl & (1 << 0)) > 0;
|
||||||
bool vport_xoffset_enable = (regs.pa_cl_vte_cntl & (1 << 1)) > 0;
|
bool vport_xoffset_enable = (regs.pa_cl_vte_cntl & (1 << 1)) > 0;
|
||||||
bool vport_yscale_enable = (regs.pa_cl_vte_cntl & (1 << 2)) > 0;
|
bool vport_yscale_enable = (regs.pa_cl_vte_cntl & (1 << 2)) > 0;
|
||||||
|
@ -865,7 +865,7 @@ bool PipelineCache::SetDynamicState(VkCommandBuffer command_buffer,
|
||||||
push_constants.window_scale[3] = (-1280.f / window_height_scalar) + 0.5f;
|
push_constants.window_scale[3] = (-1280.f / window_height_scalar) + 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// http://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf
|
// https://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf
|
||||||
// VTX_XY_FMT = true: the incoming XY have already been multiplied by 1/W0.
|
// VTX_XY_FMT = true: the incoming XY have already been multiplied by 1/W0.
|
||||||
// = false: multiply the X, Y coordinates by 1/W0.
|
// = false: multiply the X, Y coordinates by 1/W0.
|
||||||
// VTX_Z_FMT = true: the incoming Z has already been multiplied by 1/W0.
|
// VTX_Z_FMT = true: the incoming Z has already been multiplied by 1/W0.
|
||||||
|
|
|
@ -786,7 +786,7 @@ bool RenderCache::ParseConfiguration(RenderConfiguration* config) {
|
||||||
config->mode_control = regs.rb_modecontrol.edram_mode;
|
config->mode_control = regs.rb_modecontrol.edram_mode;
|
||||||
|
|
||||||
// RB_SURFACE_INFO
|
// RB_SURFACE_INFO
|
||||||
// http://fossies.org/dox/MesaLib-10.3.5/fd2__gmem_8c_source.html
|
// https://fossies.org/dox/MesaLib-10.3.5/fd2__gmem_8c_source.html
|
||||||
config->surface_pitch_px = regs.rb_surface_info.surface_pitch;
|
config->surface_pitch_px = regs.rb_surface_info.surface_pitch;
|
||||||
config->surface_msaa = regs.rb_surface_info.msaa_samples;
|
config->surface_msaa = regs.rb_surface_info.msaa_samples;
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ const TextureConfig texture_configs[64] = {
|
||||||
/* k_16_MPEG_INTERLACED */ ___(UNDEFINED),
|
/* k_16_MPEG_INTERLACED */ ___(UNDEFINED),
|
||||||
/* k_16_16_MPEG_INTERLACED */ ___(UNDEFINED),
|
/* k_16_16_MPEG_INTERLACED */ ___(UNDEFINED),
|
||||||
|
|
||||||
// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
// https://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
||||||
/* k_DXN */ ___(BC5_UNORM_BLOCK), // ?
|
/* k_DXN */ ___(BC5_UNORM_BLOCK), // ?
|
||||||
|
|
||||||
/* k_8_8_8_8_AS_16_16_16_16 */ ___(R8G8B8A8_UNORM),
|
/* k_8_8_8_8_AS_16_16_16_16 */ ___(R8G8B8A8_UNORM),
|
||||||
|
@ -116,7 +116,7 @@ const TextureConfig texture_configs[64] = {
|
||||||
/* k_DXT3A */ _c_(BC2_UNORM_BLOCK, ___R),
|
/* k_DXT3A */ _c_(BC2_UNORM_BLOCK, ___R),
|
||||||
/* k_DXT5A */ _c_(BC4_UNORM_BLOCK, RRRR), // ATI1N
|
/* k_DXT5A */ _c_(BC4_UNORM_BLOCK, RRRR), // ATI1N
|
||||||
|
|
||||||
// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
// https://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf
|
||||||
/* k_CTX1 */ ___(R8G8_UINT),
|
/* k_CTX1 */ ___(R8G8_UINT),
|
||||||
|
|
||||||
/* k_DXT3A_AS_1_1_1_1 */ ___(UNDEFINED),
|
/* k_DXT3A_AS_1_1_1_1 */ ___(UNDEFINED),
|
||||||
|
|
|
@ -916,7 +916,7 @@ bool VulkanCommandProcessor::IssueCopy() {
|
||||||
assert_true(copy_regs->copy_mask == 0);
|
assert_true(copy_regs->copy_mask == 0);
|
||||||
|
|
||||||
// RB_SURFACE_INFO
|
// RB_SURFACE_INFO
|
||||||
// http://fossies.org/dox/MesaLib-10.3.5/fd2__gmem_8c_source.html
|
// https://fossies.org/dox/MesaLib-10.3.5/fd2__gmem_8c_source.html
|
||||||
uint32_t surface_info = regs[XE_GPU_REG_RB_SURFACE_INFO].u32;
|
uint32_t surface_info = regs[XE_GPU_REG_RB_SURFACE_INFO].u32;
|
||||||
uint32_t surface_pitch = surface_info & 0x3FFF;
|
uint32_t surface_pitch = surface_info & 0x3FFF;
|
||||||
auto surface_msaa = static_cast<MsaaSamples>((surface_info >> 16) & 0x3);
|
auto surface_msaa = static_cast<MsaaSamples>((surface_info >> 16) & 0x3);
|
||||||
|
|
|
@ -68,7 +68,7 @@ enum class TextureSign : uint32_t {
|
||||||
kUnsigned = 0,
|
kUnsigned = 0,
|
||||||
// Two's complement texture data.
|
// Two's complement texture data.
|
||||||
kSigned = 1,
|
kSigned = 1,
|
||||||
// 2*color-1 - http://xboxforums.create.msdn.com/forums/t/107374.aspx
|
// 2*color-1 - https://xboxforums.create.msdn.com/forums/t/107374.aspx
|
||||||
kUnsignedBiased = 2,
|
kUnsignedBiased = 2,
|
||||||
// Linearized when sampled.
|
// Linearized when sampled.
|
||||||
kGamma = 3,
|
kGamma = 3,
|
||||||
|
|
|
@ -70,7 +70,7 @@ struct X_INPUT_CAPABILITIES {
|
||||||
static_assert_size(X_INPUT_CAPABILITIES,
|
static_assert_size(X_INPUT_CAPABILITIES,
|
||||||
sizeof(X_INPUT_GAMEPAD) + sizeof(X_INPUT_VIBRATION) + 4);
|
sizeof(X_INPUT_GAMEPAD) + sizeof(X_INPUT_VIBRATION) + 4);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinput_keystroke(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinput_keystroke(v=vs.85).aspx
|
||||||
struct X_INPUT_KEYSTROKE {
|
struct X_INPUT_KEYSTROKE {
|
||||||
be<uint16_t> virtual_key;
|
be<uint16_t> virtual_key;
|
||||||
be<uint16_t> unicode;
|
be<uint16_t> unicode;
|
||||||
|
|
|
@ -99,7 +99,7 @@ X_RESULT XInputInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
|
||||||
|
|
||||||
// XInputGetKeystroke on Windows has a bug where it will return
|
// XInputGetKeystroke on Windows has a bug where it will return
|
||||||
// ERROR_SUCCESS (0) even if the device is not connected:
|
// ERROR_SUCCESS (0) even if the device is not connected:
|
||||||
// http://stackoverflow.com/questions/23669238/xinputgetkeystroke-returning-error-success-while-controller-is-unplugged
|
// https://stackoverflow.com/questions/23669238/xinputgetkeystroke-returning-error-success-while-controller-is-unplugged
|
||||||
//
|
//
|
||||||
// So we first check if the device is connected via XInputGetCapabilities, so
|
// So we first check if the device is connected via XInputGetCapabilities, so
|
||||||
// we are not passing back an uninitialized X_INPUT_KEYSTROKE structure:
|
// we are not passing back an uninitialized X_INPUT_KEYSTROKE structure:
|
||||||
|
|
|
@ -579,7 +579,7 @@ void KernelState::RegisterNotifyListener(NotifyListener* listener) {
|
||||||
|
|
||||||
// Games seem to expect a few notifications on startup, only for the first
|
// Games seem to expect a few notifications on startup, only for the first
|
||||||
// listener.
|
// listener.
|
||||||
// http://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=resident+evil+5&start=375
|
// https://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=resident+evil+5&start=375
|
||||||
if (!has_notified_startup_ && listener->mask() & 0x00000001) {
|
if (!has_notified_startup_ && listener->mask() & 0x00000001) {
|
||||||
has_notified_startup_ = true;
|
has_notified_startup_ = true;
|
||||||
// XN_SYS_UI (on, off)
|
// XN_SYS_UI (on, off)
|
||||||
|
|
|
@ -19,8 +19,8 @@ namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
namespace util {
|
namespace util {
|
||||||
|
|
||||||
// http://freestyledash.googlecode.com/svn/trunk/Freestyle/Tools/XEX/SPA.h
|
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/XEX/SPA.h
|
||||||
// http://freestyledash.googlecode.com/svn/trunk/Freestyle/Tools/XEX/SPA.cpp
|
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/XEX/SPA.cpp
|
||||||
|
|
||||||
enum class XdbfSection : uint16_t {
|
enum class XdbfSection : uint16_t {
|
||||||
kMetadata = 0x0001,
|
kMetadata = 0x0001,
|
||||||
|
@ -49,7 +49,7 @@ struct XdbfBlock {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Wraps an XBDF (XboxDataBaseFormat) in-memory database.
|
// Wraps an XBDF (XboxDataBaseFormat) in-memory database.
|
||||||
// http://www.free60.org/wiki/XDBF
|
// https://free60project.github.io/wiki/XDBF.html
|
||||||
class XdbfWrapper {
|
class XdbfWrapper {
|
||||||
public:
|
public:
|
||||||
XdbfWrapper(const uint8_t* data, size_t data_size);
|
XdbfWrapper(const uint8_t* data, size_t data_size);
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace xam {
|
||||||
namespace apps {
|
namespace apps {
|
||||||
|
|
||||||
// Only source of docs for a lot of these functions:
|
// Only source of docs for a lot of these functions:
|
||||||
// http://freestyledash.googlecode.com/svn-history/r1/trunk/Freestyle/Scenes/Media/Music/ScnMusic.cpp
|
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Scenes/Media/Music/ScnMusic.cpp
|
||||||
|
|
||||||
class XmpApp : public App {
|
class XmpApp : public App {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -21,7 +21,7 @@ UserProfile::UserProfile() {
|
||||||
xuid_ = 0xBABEBABEBABEBABE;
|
xuid_ = 0xBABEBABEBABEBABE;
|
||||||
name_ = "User";
|
name_ = "User";
|
||||||
|
|
||||||
// http://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=gfwl+live&start=195
|
// https://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=gfwl+live&start=195
|
||||||
// https://github.com/arkem/py360/blob/master/py360/constants.py
|
// https://github.com/arkem/py360/blob/master/py360/constants.py
|
||||||
// XPROFILE_GAMER_YAXIS_INVERSION
|
// XPROFILE_GAMER_YAXIS_INVERSION
|
||||||
AddSetting(std::make_unique<Int32Setting>(0x10040002, 0));
|
AddSetting(std::make_unique<Int32Setting>(0x10040002, 0));
|
||||||
|
|
|
@ -128,7 +128,7 @@ dword_result_t XamContentResolve(dword_t user_index, lpvoid_t content_data_ptr,
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamContentResolve, kContent, kStub);
|
DECLARE_XAM_EXPORT1(XamContentResolve, kContent, kStub);
|
||||||
|
|
||||||
// http://gameservice.googlecode.com/svn-history/r14/trunk/ContentManager.cpp
|
// https://github.com/MrColdbird/gameservice/blob/master/ContentManager.cpp
|
||||||
// https://github.com/LestaD/SourceEngine2007/blob/master/se2007/engine/xboxsystem.cpp#L499
|
// https://github.com/LestaD/SourceEngine2007/blob/master/se2007/engine/xboxsystem.cpp#L499
|
||||||
dword_result_t XamContentCreateEnumerator(dword_t user_index, dword_t device_id,
|
dword_result_t XamContentCreateEnumerator(dword_t user_index, dword_t device_id,
|
||||||
dword_t content_type,
|
dword_t content_type,
|
||||||
|
|
|
@ -38,7 +38,7 @@ dword_result_t XamEnableInactivityProcessing(dword_t unk, dword_t enable) {
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamEnableInactivityProcessing, kInput, kStub);
|
DECLARE_XAM_EXPORT1(XamEnableInactivityProcessing, kInput, kStub);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetcapabilities(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetcapabilities(v=vs.85).aspx
|
||||||
dword_result_t XamInputGetCapabilities(dword_t user_index, dword_t flags,
|
dword_result_t XamInputGetCapabilities(dword_t user_index, dword_t flags,
|
||||||
pointer_t<X_INPUT_CAPABILITIES> caps) {
|
pointer_t<X_INPUT_CAPABILITIES> caps) {
|
||||||
if (!caps) {
|
if (!caps) {
|
||||||
|
@ -84,7 +84,7 @@ dword_result_t XamInputGetCapabilitiesEx(dword_t unk, dword_t user_index,
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamInputGetCapabilitiesEx, kInput, kSketchy);
|
DECLARE_XAM_EXPORT1(XamInputGetCapabilitiesEx, kInput, kSketchy);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetstate(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetstate(v=vs.85).aspx
|
||||||
dword_result_t XamInputGetState(dword_t user_index, dword_t flags,
|
dword_result_t XamInputGetState(dword_t user_index, dword_t flags,
|
||||||
pointer_t<X_INPUT_STATE> input_state) {
|
pointer_t<X_INPUT_STATE> input_state) {
|
||||||
// Games call this with a NULL state ptr, probably as a query.
|
// Games call this with a NULL state ptr, probably as a query.
|
||||||
|
@ -105,7 +105,7 @@ dword_result_t XamInputGetState(dword_t user_index, dword_t flags,
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamInputGetState, kInput, kImplemented);
|
DECLARE_XAM_EXPORT1(XamInputGetState, kInput, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputsetstate(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputsetstate(v=vs.85).aspx
|
||||||
dword_result_t XamInputSetState(dword_t user_index, dword_t unk,
|
dword_result_t XamInputSetState(dword_t user_index, dword_t unk,
|
||||||
pointer_t<X_INPUT_VIBRATION> vibration) {
|
pointer_t<X_INPUT_VIBRATION> vibration) {
|
||||||
if (!vibration) {
|
if (!vibration) {
|
||||||
|
@ -123,10 +123,10 @@ dword_result_t XamInputSetState(dword_t user_index, dword_t unk,
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamInputSetState, kInput, kImplemented);
|
DECLARE_XAM_EXPORT1(XamInputSetState, kInput, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetkeystroke(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetkeystroke(v=vs.85).aspx
|
||||||
dword_result_t XamInputGetKeystroke(dword_t user_index, dword_t flags,
|
dword_result_t XamInputGetKeystroke(dword_t user_index, dword_t flags,
|
||||||
pointer_t<X_INPUT_KEYSTROKE> keystroke) {
|
pointer_t<X_INPUT_KEYSTROKE> keystroke) {
|
||||||
// http://ffplay360.googlecode.com/svn/Test/Common/AtgXime.cpp
|
// https://github.com/CodeAsm/ffplay360/blob/master/Common/AtgXime.cpp
|
||||||
// user index = index or XUSER_INDEX_ANY
|
// user index = index or XUSER_INDEX_ANY
|
||||||
// flags = XINPUT_FLAG_GAMEPAD (| _ANYUSER | _ANYDEVICE)
|
// flags = XINPUT_FLAG_GAMEPAD (| _ANYUSER | _ANYDEVICE)
|
||||||
|
|
||||||
|
|
|
@ -483,7 +483,7 @@ dword_result_t NetDll_XNetInAddrToXnAddr(dword_t caller, lpvoid_t in_addr,
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(NetDll_XNetInAddrToXnAddr, kNetworking, kStub);
|
DECLARE_XAM_EXPORT1(NetDll_XNetInAddrToXnAddr, kNetworking, kStub);
|
||||||
|
|
||||||
// http://www.google.com/patents/WO2008112448A1?cl=en
|
// https://www.google.com/patents/WO2008112448A1?cl=en
|
||||||
// Reserves a port for use by system link
|
// Reserves a port for use by system link
|
||||||
dword_result_t NetDll_XNetSetSystemLinkPort(dword_t caller, dword_t port) {
|
dword_result_t NetDll_XNetSetSystemLinkPort(dword_t caller, dword_t port) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -32,7 +32,7 @@ dword_result_t XamNotifyCreateListener(qword_t mask, dword_t one) {
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamNotifyCreateListener, kNone, kImplemented);
|
DECLARE_XAM_EXPORT1(XamNotifyCreateListener, kNone, kImplemented);
|
||||||
|
|
||||||
// http://ffplay360.googlecode.com/svn/Test/Common/AtgSignIn.cpp
|
// https://github.com/CodeAsm/ffplay360/blob/master/Common/AtgSignIn.cpp
|
||||||
dword_result_t XNotifyGetNext(dword_t handle, dword_t match_id,
|
dword_result_t XNotifyGetNext(dword_t handle, dword_t match_id,
|
||||||
lpdword_t id_ptr, lpdword_t param_ptr) {
|
lpdword_t id_ptr, lpdword_t param_ptr) {
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
|
|
|
@ -83,7 +83,7 @@ class MessageBoxDialog : public xe::ui::ImGuiDialog {
|
||||||
uint32_t* out_chosen_button_ = nullptr;
|
uint32_t* out_chosen_button_ = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://www.se7ensins.com/forums/threads/working-xshowmessageboxui.844116/?jdfwkey=sb0vm
|
// https://www.se7ensins.com/forums/threads/working-xshowmessageboxui.844116/
|
||||||
dword_result_t XamShowMessageBoxUI(dword_t user_index, lpwstring_t title_ptr,
|
dword_result_t XamShowMessageBoxUI(dword_t user_index, lpwstring_t title_ptr,
|
||||||
lpwstring_t text_ptr, dword_t button_count,
|
lpwstring_t text_ptr, dword_t button_count,
|
||||||
lpdword_t button_ptrs, dword_t active_button,
|
lpdword_t button_ptrs, dword_t active_button,
|
||||||
|
@ -221,7 +221,7 @@ class KeyboardInputDialog : public xe::ui::ImGuiDialog {
|
||||||
size_t max_length_ = 0;
|
size_t max_length_ = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://www.se7ensins.com/forums/threads/release-how-to-use-xshowkeyboardui-release.906568/
|
// https://www.se7ensins.com/forums/threads/release-how-to-use-xshowkeyboardui-release.906568/
|
||||||
dword_result_t XamShowKeyboardUI(dword_t user_index, dword_t flags,
|
dword_result_t XamShowKeyboardUI(dword_t user_index, dword_t flags,
|
||||||
lpwstring_t default_text, lpwstring_t title,
|
lpwstring_t default_text, lpwstring_t title,
|
||||||
lpwstring_t description, lpwstring_t buffer,
|
lpwstring_t description, lpwstring_t buffer,
|
||||||
|
|
|
@ -108,7 +108,7 @@ typedef struct {
|
||||||
} X_USER_READ_PROFILE_SETTING;
|
} X_USER_READ_PROFILE_SETTING;
|
||||||
static_assert_size(X_USER_READ_PROFILE_SETTING, 40);
|
static_assert_size(X_USER_READ_PROFILE_SETTING, 40);
|
||||||
|
|
||||||
// http://freestyledash.googlecode.com/svn/trunk/Freestyle/Tools/Generic/xboxtools.cpp
|
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/Generic/xboxtools.cpp
|
||||||
dword_result_t XamUserReadProfileSettings(
|
dword_result_t XamUserReadProfileSettings(
|
||||||
dword_t title_id, dword_t user_index, dword_t unk_0, dword_t unk_1,
|
dword_t title_id, dword_t user_index, dword_t unk_0, dword_t unk_1,
|
||||||
dword_t setting_count, lpdword_t setting_ids, lpdword_t buffer_size_ptr,
|
dword_t setting_count, lpdword_t setting_ids, lpdword_t buffer_size_ptr,
|
||||||
|
|
|
@ -71,7 +71,7 @@ void RtlRaiseException(pointer_t<X_EXCEPTION_RECORD> record) {
|
||||||
|
|
||||||
if (record->exception_code == 0xE06D7363) {
|
if (record->exception_code == 0xE06D7363) {
|
||||||
// C++ exception.
|
// C++ exception.
|
||||||
// http://blogs.msdn.com/b/oldnewthing/archive/2010/07/30/10044061.aspx
|
// https://blogs.msdn.com/b/oldnewthing/archive/2010/07/30/10044061.aspx
|
||||||
xe::debugging::Break();
|
xe::debugging::Break();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
namespace xboxkrnl {
|
namespace xboxkrnl {
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff540287.aspx
|
// https://msdn.microsoft.com/en-us/library/windows/hardware/ff540287.aspx
|
||||||
struct X_FILE_FS_VOLUME_INFORMATION {
|
struct X_FILE_FS_VOLUME_INFORMATION {
|
||||||
// FILE_FS_VOLUME_INFORMATION
|
// FILE_FS_VOLUME_INFORMATION
|
||||||
xe::be<uint64_t> creation_time;
|
xe::be<uint64_t> creation_time;
|
||||||
|
@ -45,7 +45,7 @@ struct X_FILE_FS_SIZE_INFORMATION {
|
||||||
};
|
};
|
||||||
static_assert_size(X_FILE_FS_SIZE_INFORMATION, 24);
|
static_assert_size(X_FILE_FS_SIZE_INFORMATION, 24);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff540251(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/hardware/ff540251(v=vs.85).aspx
|
||||||
struct X_FILE_FS_ATTRIBUTE_INFORMATION {
|
struct X_FILE_FS_ATTRIBUTE_INFORMATION {
|
||||||
// FILE_FS_ATTRIBUTE_INFORMATION
|
// FILE_FS_ATTRIBUTE_INFORMATION
|
||||||
xe::be<uint32_t> attributes;
|
xe::be<uint32_t> attributes;
|
||||||
|
@ -56,7 +56,7 @@ struct X_FILE_FS_ATTRIBUTE_INFORMATION {
|
||||||
static_assert_size(X_FILE_FS_ATTRIBUTE_INFORMATION, 16);
|
static_assert_size(X_FILE_FS_ATTRIBUTE_INFORMATION, 16);
|
||||||
|
|
||||||
struct CreateOptions {
|
struct CreateOptions {
|
||||||
// http://processhacker.sourceforge.net/doc/ntioapi_8h.html
|
// https://processhacker.sourceforge.io/doc/ntioapi_8h.html
|
||||||
static const uint32_t FILE_DIRECTORY_FILE = 0x00000001;
|
static const uint32_t FILE_DIRECTORY_FILE = 0x00000001;
|
||||||
// Optimization - files access will be sequential, not random.
|
// Optimization - files access will be sequential, not random.
|
||||||
static const uint32_t FILE_SEQUENTIAL_ONLY = 0x00000004;
|
static const uint32_t FILE_SEQUENTIAL_ONLY = 0x00000004;
|
||||||
|
|
|
@ -496,7 +496,7 @@ dword_result_t MmQueryStatistics(
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(MmQueryStatistics, kMemory, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(MmQueryStatistics, kMemory, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/hardware/ff554547(v=vs.85).aspx
|
// https://msdn.microsoft.com/en-us/library/windows/hardware/ff554547(v=vs.85).aspx
|
||||||
dword_result_t MmGetPhysicalAddress(dword_t base_address) {
|
dword_result_t MmGetPhysicalAddress(dword_t base_address) {
|
||||||
// PHYSICAL_ADDRESS MmGetPhysicalAddress(
|
// PHYSICAL_ADDRESS MmGetPhysicalAddress(
|
||||||
// _In_ PVOID BaseAddress
|
// _In_ PVOID BaseAddress
|
||||||
|
|
|
@ -26,8 +26,8 @@ X_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting,
|
||||||
uint32_t value = 0;
|
uint32_t value = 0;
|
||||||
|
|
||||||
// TODO(benvanik): have real structs here that just get copied from.
|
// TODO(benvanik): have real structs here that just get copied from.
|
||||||
// http://free60.org/XConfig
|
// https://free60project.github.io/wiki/XConfig.html
|
||||||
// http://freestyledash.googlecode.com/svn/trunk/Freestyle/Tools/Generic/ExConfig.h
|
// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/Generic/ExConfig.h
|
||||||
switch (category) {
|
switch (category) {
|
||||||
case 0x0002:
|
case 0x0002:
|
||||||
// XCONFIG_SECURED_CATEGORY
|
// XCONFIG_SECURED_CATEGORY
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
namespace xboxkrnl {
|
namespace xboxkrnl {
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff561778
|
// https://msdn.microsoft.com/en-us/library/ff561778
|
||||||
dword_result_t RtlCompareMemory(lpvoid_t source1, lpvoid_t source2,
|
dword_result_t RtlCompareMemory(lpvoid_t source1, lpvoid_t source2,
|
||||||
dword_t length) {
|
dword_t length) {
|
||||||
uint8_t* p1 = source1;
|
uint8_t* p1 = source1;
|
||||||
|
@ -54,7 +54,7 @@ dword_result_t RtlCompareMemory(lpvoid_t source1, lpvoid_t source2,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlCompareMemory, kMemory, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlCompareMemory, kMemory, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff552123
|
// https://msdn.microsoft.com/en-us/library/ff552123
|
||||||
dword_result_t RtlCompareMemoryUlong(lpvoid_t source, dword_t length,
|
dword_result_t RtlCompareMemoryUlong(lpvoid_t source, dword_t length,
|
||||||
dword_t pattern) {
|
dword_t pattern) {
|
||||||
// Return 0 if source/length not aligned
|
// Return 0 if source/length not aligned
|
||||||
|
@ -75,7 +75,7 @@ dword_result_t RtlCompareMemoryUlong(lpvoid_t source, dword_t length,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlCompareMemoryUlong, kMemory, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlCompareMemoryUlong, kMemory, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff552263
|
// https://msdn.microsoft.com/en-us/library/ff552263
|
||||||
void RtlFillMemoryUlong(lpvoid_t destination, dword_t length, dword_t pattern) {
|
void RtlFillMemoryUlong(lpvoid_t destination, dword_t length, dword_t pattern) {
|
||||||
// NOTE: length must be % 4, so we can work on uint32s.
|
// NOTE: length must be % 4, so we can work on uint32s.
|
||||||
uint32_t count = length >> 2;
|
uint32_t count = length >> 2;
|
||||||
|
@ -138,7 +138,7 @@ dword_result_t RtlCompareStringN(lpstring_t string_1, dword_t string_1_len,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlCompareStringN, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlCompareStringN, kNone, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff561918
|
// https://msdn.microsoft.com/en-us/library/ff561918
|
||||||
void RtlInitAnsiString(pointer_t<X_ANSI_STRING> destination,
|
void RtlInitAnsiString(pointer_t<X_ANSI_STRING> destination,
|
||||||
lpstring_t source) {
|
lpstring_t source) {
|
||||||
if (source) {
|
if (source) {
|
||||||
|
@ -153,7 +153,7 @@ void RtlInitAnsiString(pointer_t<X_ANSI_STRING> destination,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlInitAnsiString, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlInitAnsiString, kNone, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff561899
|
// https://msdn.microsoft.com/en-us/library/ff561899
|
||||||
void RtlFreeAnsiString(pointer_t<X_ANSI_STRING> string) {
|
void RtlFreeAnsiString(pointer_t<X_ANSI_STRING> string) {
|
||||||
if (string->pointer) {
|
if (string->pointer) {
|
||||||
kernel_memory()->SystemHeapFree(string->pointer);
|
kernel_memory()->SystemHeapFree(string->pointer);
|
||||||
|
@ -163,7 +163,7 @@ void RtlFreeAnsiString(pointer_t<X_ANSI_STRING> string) {
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlFreeAnsiString, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlFreeAnsiString, kNone, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff561934
|
// https://msdn.microsoft.com/en-us/library/ff561934
|
||||||
void RtlInitUnicodeString(pointer_t<X_UNICODE_STRING> destination,
|
void RtlInitUnicodeString(pointer_t<X_UNICODE_STRING> destination,
|
||||||
lpwstring_t source) {
|
lpwstring_t source) {
|
||||||
if (source) {
|
if (source) {
|
||||||
|
@ -176,7 +176,7 @@ void RtlInitUnicodeString(pointer_t<X_UNICODE_STRING> destination,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlInitUnicodeString, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlInitUnicodeString, kNone, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff561903
|
// https://msdn.microsoft.com/en-us/library/ff561903
|
||||||
void RtlFreeUnicodeString(pointer_t<X_UNICODE_STRING> string) {
|
void RtlFreeUnicodeString(pointer_t<X_UNICODE_STRING> string) {
|
||||||
if (string->pointer) {
|
if (string->pointer) {
|
||||||
kernel_memory()->SystemHeapFree(string->pointer);
|
kernel_memory()->SystemHeapFree(string->pointer);
|
||||||
|
@ -220,7 +220,7 @@ void RtlCopyUnicodeString(pointer_t<X_UNICODE_STRING> destination,
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(RtlCopyUnicodeString, kNone, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(RtlCopyUnicodeString, kNone, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ff562969
|
// https://msdn.microsoft.com/en-us/library/ff562969
|
||||||
dword_result_t RtlUnicodeStringToAnsiString(
|
dword_result_t RtlUnicodeStringToAnsiString(
|
||||||
pointer_t<X_ANSI_STRING> destination_ptr,
|
pointer_t<X_ANSI_STRING> destination_ptr,
|
||||||
pointer_t<X_UNICODE_STRING> source_ptr, dword_t alloc_dest) {
|
pointer_t<X_UNICODE_STRING> source_ptr, dword_t alloc_dest) {
|
||||||
|
@ -332,9 +332,9 @@ DECLARE_XBOXKRNL_EXPORT1(RtlImageXexHeaderField, kNone, kImplemented);
|
||||||
// into guest memory, as it should be opaque and so long as our size is right
|
// into guest memory, as it should be opaque and so long as our size is right
|
||||||
// the user code will never know.
|
// the user code will never know.
|
||||||
//
|
//
|
||||||
// Ref: http://msdn.microsoft.com/en-us/magazine/cc164040.aspx
|
// Ref: https://web.archive.org/web/20161214022602/https://msdn.microsoft.com/en-us/magazine/cc164040.aspx
|
||||||
// Ref:
|
// Ref:
|
||||||
// http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/critical.c?view=markup
|
// https://github.com/reactos/reactos/blob/master/sdk/lib/rtl/critical.c
|
||||||
|
|
||||||
// This structure tries to match the one on the 360 as best I can figure out.
|
// This structure tries to match the one on the 360 as best I can figure out.
|
||||||
// Unfortunately some games have the critical sections pre-initialized in
|
// Unfortunately some games have the critical sections pre-initialized in
|
||||||
|
|
|
@ -313,7 +313,7 @@ void KeQuerySystemTime(lpqword_t time_ptr) {
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(KeQuerySystemTime, kThreading, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(KeQuerySystemTime, kThreading, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms686801
|
// https://msdn.microsoft.com/en-us/library/ms686801
|
||||||
dword_result_t KeTlsAlloc() {
|
dword_result_t KeTlsAlloc() {
|
||||||
uint32_t slot = kernel_state()->AllocateTLS();
|
uint32_t slot = kernel_state()->AllocateTLS();
|
||||||
XThread::GetCurrentThread()->SetTLSValue(slot, 0);
|
XThread::GetCurrentThread()->SetTLSValue(slot, 0);
|
||||||
|
@ -322,7 +322,7 @@ dword_result_t KeTlsAlloc() {
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(KeTlsAlloc, kThreading, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(KeTlsAlloc, kThreading, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms686804
|
// https://msdn.microsoft.com/en-us/library/ms686804
|
||||||
dword_result_t KeTlsFree(dword_t tls_index) {
|
dword_result_t KeTlsFree(dword_t tls_index) {
|
||||||
if (tls_index == X_TLS_OUT_OF_INDEXES) {
|
if (tls_index == X_TLS_OUT_OF_INDEXES) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -333,7 +333,7 @@ dword_result_t KeTlsFree(dword_t tls_index) {
|
||||||
}
|
}
|
||||||
DECLARE_XBOXKRNL_EXPORT1(KeTlsFree, kThreading, kImplemented);
|
DECLARE_XBOXKRNL_EXPORT1(KeTlsFree, kThreading, kImplemented);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms686812
|
// https://msdn.microsoft.com/en-us/library/ms686812
|
||||||
dword_result_t KeTlsGetValue(dword_t tls_index) {
|
dword_result_t KeTlsGetValue(dword_t tls_index) {
|
||||||
// xboxkrnl doesn't actually have an error branch - it always succeeds, even
|
// xboxkrnl doesn't actually have an error branch - it always succeeds, even
|
||||||
// if it overflows the TLS.
|
// if it overflows the TLS.
|
||||||
|
@ -347,7 +347,7 @@ dword_result_t KeTlsGetValue(dword_t tls_index) {
|
||||||
DECLARE_XBOXKRNL_EXPORT2(KeTlsGetValue, kThreading, kImplemented,
|
DECLARE_XBOXKRNL_EXPORT2(KeTlsGetValue, kThreading, kImplemented,
|
||||||
kHighFrequency);
|
kHighFrequency);
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/ms686818
|
// https://msdn.microsoft.com/en-us/library/ms686818
|
||||||
dword_result_t KeTlsSetValue(dword_t tls_index, dword_t tls_value) {
|
dword_result_t KeTlsSetValue(dword_t tls_index, dword_t tls_value) {
|
||||||
// xboxkrnl doesn't actually have an error branch - it always succeeds, even
|
// xboxkrnl doesn't actually have an error branch - it always succeeds, even
|
||||||
// if it overflows the TLS.
|
// if it overflows the TLS.
|
||||||
|
|
|
@ -24,17 +24,17 @@ namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
namespace xboxkrnl {
|
namespace xboxkrnl {
|
||||||
|
|
||||||
// http://www.tweakoz.com/orkid/
|
// https://web.archive.org/web/20150805074003/https://www.tweakoz.com/orkid/
|
||||||
// http://www.tweakoz.com/orkid/dox/d3/d52/xb360init_8cpp_source.html
|
// http://www.tweakoz.com/orkid/dox/d3/d52/xb360init_8cpp_source.html
|
||||||
// https://github.com/Free60Project/xenosfb/
|
// https://github.com/Free60Project/xenosfb/
|
||||||
// https://github.com/Free60Project/xenosfb/blob/master/src/xe.h
|
// https://github.com/Free60Project/xenosfb/blob/master/src/xe.h
|
||||||
// https://github.com/gligli/libxemit
|
// https://github.com/gligli/libxemit
|
||||||
// http://web.archive.org/web/20090428095215/http://msdn.microsoft.com/en-us/library/bb313877.aspx
|
// https://web.archive.org/web/20090428095215/https://msdn.microsoft.com/en-us/library/bb313877.aspx
|
||||||
// http://web.archive.org/web/20100423054747/http://msdn.microsoft.com/en-us/library/bb313961.aspx
|
// https://web.archive.org/web/20100423054747/https://msdn.microsoft.com/en-us/library/bb313961.aspx
|
||||||
// http://web.archive.org/web/20100423054747/http://msdn.microsoft.com/en-us/library/bb313878.aspx
|
// https://web.archive.org/web/20100423054747/https://msdn.microsoft.com/en-us/library/bb313878.aspx
|
||||||
// http://web.archive.org/web/20090510235238/http://msdn.microsoft.com/en-us/library/bb313942.aspx
|
// https://web.archive.org/web/20090510235238/https://msdn.microsoft.com/en-us/library/bb313942.aspx
|
||||||
// http://svn.dd-wrt.com/browser/src/linux/universal/linux-3.8/drivers/gpu/drm/radeon/radeon_ring.c
|
// https://svn.dd-wrt.com/browser/src/linux/universal/linux-3.8/drivers/gpu/drm/radeon/radeon_ring.c?rev=21595
|
||||||
// http://www.microsoft.com/en-za/download/details.aspx?id=5313 -- "Stripped
|
// https://www.microsoft.com/en-za/download/details.aspx?id=5313 -- "Stripped
|
||||||
// Down Direct3D: Xbox 360 Command Buffer and Resource Management"
|
// Down Direct3D: Xbox 360 Command Buffer and Resource Management"
|
||||||
|
|
||||||
void VdGetCurrentDisplayGamma(lpdword_t type_ptr, lpfloat_t unknown_ptr) {
|
void VdGetCurrentDisplayGamma(lpdword_t type_ptr, lpfloat_t unknown_ptr) {
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/KEVENT.html
|
// https://www.nirsoft.net/kernel_struct/vista/KEVENT.html
|
||||||
struct X_KEVENT {
|
struct X_KEVENT {
|
||||||
X_DISPATCH_HEADER header;
|
X_DISPATCH_HEADER header;
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/LDR_DATA_TABLE_ENTRY.html
|
// https://www.nirsoft.net/kernel_struct/vista/LDR_DATA_TABLE_ENTRY.html
|
||||||
// HMODULE points to this struct!
|
// HMODULE points to this struct!
|
||||||
struct X_LDR_DATA_TABLE_ENTRY {
|
struct X_LDR_DATA_TABLE_ENTRY {
|
||||||
X_LIST_ENTRY in_load_order_links; // 0x0
|
X_LIST_ENTRY in_load_order_links; // 0x0
|
||||||
|
|
|
@ -385,7 +385,7 @@ object_ref<XObject> XObject::GetNativeObject(KernelState* kernel_state,
|
||||||
return object;
|
return object;
|
||||||
} else {
|
} else {
|
||||||
// First use, create new.
|
// First use, create new.
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/KOBJECTS.html
|
// https://www.nirsoft.net/kernel_struct/vista/KOBJECTS.html
|
||||||
XObject* object = nullptr;
|
XObject* object = nullptr;
|
||||||
switch (as_type) {
|
switch (as_type) {
|
||||||
case 0: // EventNotificationObject
|
case 0: // EventNotificationObject
|
||||||
|
|
|
@ -32,7 +32,7 @@ class KernelState;
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class object_ref;
|
class object_ref;
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/DISPATCHER_HEADER.html
|
// https://www.nirsoft.net/kernel_struct/vista/DISPATCHER_HEADER.html
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct {
|
struct {
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
@ -60,7 +60,7 @@ typedef struct {
|
||||||
} X_DISPATCH_HEADER;
|
} X_DISPATCH_HEADER;
|
||||||
static_assert_size(X_DISPATCH_HEADER, 0x10);
|
static_assert_size(X_DISPATCH_HEADER, 0x10);
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/OBJECT_HEADER.html
|
// https://www.nirsoft.net/kernel_struct/vista/OBJECT_HEADER.html
|
||||||
struct X_OBJECT_HEADER {
|
struct X_OBJECT_HEADER {
|
||||||
xe::be<uint32_t> pointer_count;
|
xe::be<uint32_t> pointer_count;
|
||||||
union {
|
union {
|
||||||
|
@ -82,7 +82,7 @@ struct X_OBJECT_HEADER {
|
||||||
// (There's actually a body field here which is the object itself)
|
// (There's actually a body field here which is the object itself)
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/OBJECT_CREATE_INFORMATION.html
|
// https://www.nirsoft.net/kernel_struct/vista/OBJECT_CREATE_INFORMATION.html
|
||||||
struct X_OBJECT_CREATE_INFORMATION {
|
struct X_OBJECT_CREATE_INFORMATION {
|
||||||
xe::be<uint32_t> attributes; // 0x0
|
xe::be<uint32_t> attributes; // 0x0
|
||||||
xe::be<uint32_t> root_directory_ptr; // 0x4
|
xe::be<uint32_t> root_directory_ptr; // 0x4
|
||||||
|
|
|
@ -82,7 +82,7 @@ class XSocket : public XObject {
|
||||||
IPPROTO_UDP = 17,
|
IPPROTO_UDP = 17,
|
||||||
|
|
||||||
// LIVE Voice and Data Protocol
|
// LIVE Voice and Data Protocol
|
||||||
// http://blog.csdn.net/baozi3026/article/details/4277227
|
// https://blog.csdn.net/baozi3026/article/details/4277227
|
||||||
// Format: [cbGameData][GameData(encrypted)][VoiceData(unencrypted)]
|
// Format: [cbGameData][GameData(encrypted)][VoiceData(unencrypted)]
|
||||||
IPPROTO_VDP = 254,
|
IPPROTO_VDP = 254,
|
||||||
};
|
};
|
||||||
|
|
|
@ -313,7 +313,7 @@ X_STATUS XThread::Create() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate thread state block from heap.
|
// Allocate thread state block from heap.
|
||||||
// http://www.microsoft.com/msj/archive/s2ce.aspx
|
// https://web.archive.org/web/20170704035330/https://www.microsoft.com/msj/archive/S2CE.aspx
|
||||||
// This is set as r13 for user code and some special inlined Win32 calls
|
// This is set as r13 for user code and some special inlined Win32 calls
|
||||||
// (like GetLastError/etc) will poke it directly.
|
// (like GetLastError/etc) will poke it directly.
|
||||||
// We try to use it as our primary store of data just to keep things all
|
// We try to use it as our primary store of data just to keep things all
|
||||||
|
@ -568,8 +568,8 @@ void XThread::EnqueueApc(uint32_t normal_routine, uint32_t normal_context,
|
||||||
}
|
}
|
||||||
|
|
||||||
void XThread::DeliverAPCs() {
|
void XThread::DeliverAPCs() {
|
||||||
// http://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=1
|
// https://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=1
|
||||||
// http://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=7
|
// https://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=7
|
||||||
auto processor = kernel_state()->processor();
|
auto processor = kernel_state()->processor();
|
||||||
LockApc();
|
LockApc();
|
||||||
while (apc_list_.HasPending()) {
|
while (apc_list_.HasPending()) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ std::unique_ptr<VulkanProvider> VulkanProvider::Create(Window* main_window) {
|
||||||
"Ensure you have the latest drivers for your GPU and that it "
|
"Ensure you have the latest drivers for your GPU and that it "
|
||||||
"supports Vulkan.\n"
|
"supports Vulkan.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"See http://xenia.jp/faq/ for more information and a list of supported "
|
"See https://xenia.jp/faq/ for more information and a list of supported "
|
||||||
"GPUs.");
|
"GPUs.");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -403,7 +403,7 @@ void FatalVulkanError(std::string error) {
|
||||||
"Ensure you have the latest drivers for your GPU and that it supports "
|
"Ensure you have the latest drivers for your GPU and that it supports "
|
||||||
"Vulkan.\n"
|
"Vulkan.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"See http://xenia.jp/faq/ for more information and a list of supported "
|
"See https://xenia.jp/faq/ for more information and a list of supported "
|
||||||
"GPUs.");
|
"GPUs.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,7 @@ void Win32Window::ToggleFullscreen(bool fullscreen) {
|
||||||
|
|
||||||
DWORD style = GetWindowLong(hwnd_, GWL_STYLE);
|
DWORD style = GetWindowLong(hwnd_, GWL_STYLE);
|
||||||
if (fullscreen) {
|
if (fullscreen) {
|
||||||
// http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx
|
// https://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx
|
||||||
MONITORINFO mi = {sizeof(mi)};
|
MONITORINFO mi = {sizeof(mi)};
|
||||||
if (GetWindowPlacement(hwnd_, &windowed_pos_) &&
|
if (GetWindowPlacement(hwnd_, &windowed_pos_) &&
|
||||||
GetMonitorInfo(MonitorFromWindow(hwnd_, MONITOR_DEFAULTTOPRIMARY),
|
GetMonitorInfo(MonitorFromWindow(hwnd_, MONITOR_DEFAULTTOPRIMARY),
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace vfs {
|
namespace vfs {
|
||||||
|
|
||||||
// http://www.free60.org/wiki/STFS
|
// https://free60project.github.io/wiki/STFS.html
|
||||||
|
|
||||||
class StfsContainerEntry;
|
class StfsContainerEntry;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace vfs {
|
||||||
class Device;
|
class Device;
|
||||||
class File;
|
class File;
|
||||||
|
|
||||||
// Matches http://source.winehq.org/source/include/winternl.h#1591.
|
// Matches https://source.winehq.org/source/include/winternl.h#1591.
|
||||||
enum class FileAction {
|
enum class FileAction {
|
||||||
kSuperseded = 0,
|
kSuperseded = 0,
|
||||||
kOpened = 1,
|
kOpened = 1,
|
||||||
|
|
|
@ -27,7 +27,7 @@ typedef uint32_t X_HANDLE;
|
||||||
// TODO(benvanik): type all of this so we get some safety.
|
// TODO(benvanik): type all of this so we get some safety.
|
||||||
|
|
||||||
// NT_STATUS (STATUS_*)
|
// NT_STATUS (STATUS_*)
|
||||||
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
|
// https://msdn.microsoft.com/en-us/library/cc704588.aspx
|
||||||
// Adding as needed.
|
// Adding as needed.
|
||||||
typedef uint32_t X_STATUS;
|
typedef uint32_t X_STATUS;
|
||||||
#define XSUCCEEDED(s) ((s & 0xC0000000) == 0)
|
#define XSUCCEEDED(s) ((s & 0xC0000000) == 0)
|
||||||
|
@ -160,7 +160,7 @@ enum X_FILE_ATTRIBUTES : uint32_t {
|
||||||
X_FILE_ATTRIBUTE_ENCRYPTED = 0x4000,
|
X_FILE_ATTRIBUTE_ENCRYPTED = 0x4000,
|
||||||
};
|
};
|
||||||
|
|
||||||
// http://code.google.com/p/vdash/source/browse/trunk/vdash/include/kernel.h
|
// https://github.com/oukiar/vdash/blob/master/vdash/include/kernel.h
|
||||||
enum X_FILE_INFORMATION_CLASS {
|
enum X_FILE_INFORMATION_CLASS {
|
||||||
XFileDirectoryInformation = 1,
|
XFileDirectoryInformation = 1,
|
||||||
XFileFullDirectoryInformation,
|
XFileFullDirectoryInformation,
|
||||||
|
@ -324,10 +324,10 @@ struct X_UNICODE_STRING {
|
||||||
};
|
};
|
||||||
static_assert_size(X_UNICODE_STRING, 8);
|
static_assert_size(X_UNICODE_STRING, 8);
|
||||||
|
|
||||||
// http://pastebin.com/SMypYikG
|
// https://pastebin.com/SMypYikG
|
||||||
typedef uint32_t XNotificationID;
|
typedef uint32_t XNotificationID;
|
||||||
|
|
||||||
// http://ffplay360.googlecode.com/svn/trunk/Common/XTLOnPC.h
|
// https://github.com/CodeAsm/ffplay360/blob/master/Common/XTLOnPC.h
|
||||||
struct X_VIDEO_MODE {
|
struct X_VIDEO_MODE {
|
||||||
be<uint32_t> display_width;
|
be<uint32_t> display_width;
|
||||||
be<uint32_t> display_height;
|
be<uint32_t> display_height;
|
||||||
|
@ -361,7 +361,7 @@ struct X_SINGLE_LIST_ENTRY {
|
||||||
};
|
};
|
||||||
static_assert_size(X_SINGLE_LIST_ENTRY, 4);
|
static_assert_size(X_SINGLE_LIST_ENTRY, 4);
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/SLIST_HEADER.html
|
// https://www.nirsoft.net/kernel_struct/vista/SLIST_HEADER.html
|
||||||
struct X_SLIST_HEADER {
|
struct X_SLIST_HEADER {
|
||||||
X_SINGLE_LIST_ENTRY next; // 0x0
|
X_SINGLE_LIST_ENTRY next; // 0x0
|
||||||
be<uint16_t> depth; // 0x4
|
be<uint16_t> depth; // 0x4
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
This requires XNA Game Studio 3.1 to be installed (not just the redist):
|
This requires XNA Game Studio 3.1 to be installed (not just the redist):
|
||||||
http://www.microsoft.com/en-us/download/details.aspx?id=39
|
https://www.microsoft.com/en-us/download/details.aspx?id=39
|
||||||
|
|
||||||
It's not really compatible with modern VS', but you can open the downloaded
|
It's not really compatible with modern VS', but you can open the downloaded
|
||||||
`XNAGS31_setup.exe` with 7zip and run the included `redists.msi` directly.
|
`XNAGS31_setup.exe` with 7zip and run the included `redists.msi` directly.
|
||||||
|
|
|
@ -304,7 +304,7 @@ def get_clang_format_binary():
|
||||||
if has_bin(binary):
|
if has_bin(binary):
|
||||||
return binary
|
return binary
|
||||||
print('ERROR: clang-format is not on PATH')
|
print('ERROR: clang-format is not on PATH')
|
||||||
print('LLVM is available from http://llvm.org/releases/download.html')
|
print('LLVM is available from https://llvm.org/releases/download.html')
|
||||||
print('At least version 3.8 is required.')
|
print('At least version 3.8 is required.')
|
||||||
print('See docs/style_guide.md for instructions on how to get it.')
|
print('See docs/style_guide.md for instructions on how to get it.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
Loading…
Reference in New Issue