Massive refactoring of all code + audio skeleton.
This should make it easier to find files and (in the future) split things up into separate libraries. It also changes around emulator initialization to make it a little more difficult to do things out of order and a little more sensible as to when real init work happens. Also adding a skeleton audio system/driver and reworking CPU register access to be more extensible.
This commit is contained in:
248
src/xenia/xbox.h
Normal file
248
src/xenia/xbox.h
Normal file
@@ -0,0 +1,248 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef XENIA_XBOX_H_
|
||||
#define XENIA_XBOX_H_
|
||||
|
||||
#include <xenia/common.h>
|
||||
#include <xenia/core.h>
|
||||
|
||||
|
||||
namespace xe {
|
||||
|
||||
|
||||
typedef uint32_t X_HANDLE;
|
||||
#define X_INVALID_HANDLE_VALUE ((X_HANDLE)-1)
|
||||
|
||||
|
||||
// NT_STATUS (STATUS_*)
|
||||
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
|
||||
// Adding as needed.
|
||||
typedef uint32_t X_STATUS;
|
||||
#define XFAILED(s) (s & X_STATUS_UNSUCCESSFUL)
|
||||
#define XSUCCEEDED(s) !XFAILED(s)
|
||||
#define X_STATUS_SUCCESS ((uint32_t)0x00000000L)
|
||||
#define X_STATUS_ABANDONED_WAIT_0 ((uint32_t)0x00000080L)
|
||||
#define X_STATUS_USER_APC ((uint32_t)0x000000C0L)
|
||||
#define X_STATUS_ALERTED ((uint32_t)0x00000101L)
|
||||
#define X_STATUS_TIMEOUT ((uint32_t)0x00000102L)
|
||||
#define X_STATUS_PENDING ((uint32_t)0x00000103L)
|
||||
#define X_STATUS_UNSUCCESSFUL ((uint32_t)0xC0000001L)
|
||||
#define X_STATUS_NOT_IMPLEMENTED ((uint32_t)0xC0000002L)
|
||||
#define X_STATUS_ACCESS_VIOLATION ((uint32_t)0xC0000005L)
|
||||
#define X_STATUS_INVALID_HANDLE ((uint32_t)0xC0000008L)
|
||||
#define X_STATUS_INVALID_PARAMETER ((uint32_t)0xC000000DL)
|
||||
#define X_STATUS_NO_SUCH_FILE ((uint32_t)0xC000000FL)
|
||||
#define X_STATUS_NO_MEMORY ((uint32_t)0xC0000017L)
|
||||
#define X_STATUS_ALREADY_COMMITTED ((uint32_t)0xC0000021L)
|
||||
#define X_STATUS_ACCESS_DENIED ((uint32_t)0xC0000022L)
|
||||
#define X_STATUS_BUFFER_TOO_SMALL ((uint32_t)0xC0000023L)
|
||||
#define X_STATUS_OBJECT_TYPE_MISMATCH ((uint32_t)0xC0000024L)
|
||||
#define X_STATUS_INVALID_PAGE_PROTECTION ((uint32_t)0xC0000045L)
|
||||
#define X_STATUS_MEMORY_NOT_ALLOCATED ((uint32_t)0xC00000A0L)
|
||||
#define X_STATUS_INVALID_PARAMETER_1 ((uint32_t)0xC00000EFL)
|
||||
#define X_STATUS_INVALID_PARAMETER_2 ((uint32_t)0xC00000F0L)
|
||||
#define X_STATUS_INVALID_PARAMETER_3 ((uint32_t)0xC00000F1L)
|
||||
|
||||
// MEM_*, used by NtAllocateVirtualMemory
|
||||
#define X_MEM_COMMIT 0x00001000
|
||||
#define X_MEM_RESERVE 0x00002000
|
||||
#define X_MEM_DECOMMIT 0x00004000
|
||||
#define X_MEM_RELEASE 0x00008000
|
||||
#define X_MEM_FREE 0x00010000
|
||||
#define X_MEM_PRIVATE 0x00020000
|
||||
#define X_MEM_RESET 0x00080000
|
||||
#define X_MEM_TOP_DOWN 0x00100000
|
||||
#define X_MEM_NOZERO 0x00800000
|
||||
#define X_MEM_LARGE_PAGES 0x20000000
|
||||
#define X_MEM_HEAP 0x40000000
|
||||
#define X_MEM_16MB_PAGES 0x80000000 // from Valve SDK
|
||||
|
||||
// FILE_*, used by NtOpenFile
|
||||
#define X_FILE_SUPERSEDED 0x00000000
|
||||
#define X_FILE_OPENED 0x00000001
|
||||
#define X_FILE_CREATED 0x00000002
|
||||
#define X_FILE_OVERWRITTEN 0x00000003
|
||||
#define X_FILE_EXISTS 0x00000004
|
||||
#define X_FILE_DOES_NOT_EXIST 0x00000005
|
||||
|
||||
|
||||
// PAGE_*, used by NtAllocateVirtualMemory
|
||||
#define X_PAGE_NOACCESS 0x00000001
|
||||
#define X_PAGE_READONLY 0x00000002
|
||||
#define X_PAGE_READWRITE 0x00000004
|
||||
#define X_PAGE_WRITECOPY 0x00000008
|
||||
#define X_PAGE_EXECUTE 0x00000010
|
||||
#define X_PAGE_EXECUTE_READ 0x00000020
|
||||
#define X_PAGE_EXECUTE_READWRITE 0x00000040
|
||||
#define X_PAGE_EXECUTE_WRITECOPY 0x00000080
|
||||
#define X_PAGE_GUARD 0x00000100
|
||||
#define X_PAGE_NOCACHE 0x00000200
|
||||
#define X_PAGE_WRITECOMBINE 0x00000400
|
||||
|
||||
|
||||
// (?), used by KeGetCurrentProcessType
|
||||
#define X_PROCTYPE_IDLE 0
|
||||
#define X_PROCTYPE_USER 1
|
||||
#define X_PROCTYPE_SYSTEM 2
|
||||
|
||||
|
||||
// Thread enums.
|
||||
#define X_CREATE_SUSPENDED 0x00000004
|
||||
|
||||
|
||||
// TLS specials.
|
||||
#define X_TLS_OUT_OF_INDEXES UINT32_MAX // (-1)
|
||||
|
||||
|
||||
// Languages.
|
||||
#define X_LANGUAGE_ENGLISH 1
|
||||
#define X_LANGUAGE_JAPANESE 2
|
||||
|
||||
|
||||
typedef enum _X_FILE_ATTRIBUTES {
|
||||
X_FILE_ATTRIBUTE_NONE = 0x0000,
|
||||
X_FILE_ATTRIBUTE_READONLY = 0x0001,
|
||||
X_FILE_ATTRIBUTE_HIDDEN = 0x0002,
|
||||
X_FILE_ATTRIBUTE_SYSTEM = 0x0004,
|
||||
X_FILE_ATTRIBUTE_DIRECTORY = 0x0010,
|
||||
X_FILE_ATTRIBUTE_ARCHIVE = 0x0020,
|
||||
X_FILE_ATTRIBUTE_DEVICE = 0x0040,
|
||||
X_FILE_ATTRIBUTE_NORMAL = 0x0080,
|
||||
X_FILE_ATTRIBUTE_TEMPORARY = 0x0100,
|
||||
X_FILE_ATTRIBUTE_COMPRESSED = 0x0800,
|
||||
X_FILE_ATTRIBUTE_ENCRYPTED = 0x4000,
|
||||
} X_FILE_ATTRIBUTES;
|
||||
|
||||
|
||||
typedef enum _X_FILE_INFORMATION_CLASS {
|
||||
XFileDirectoryInformation = 1,
|
||||
XFileFullDirectoryInformation,
|
||||
XFileBothDirectoryInformation,
|
||||
XFileBasicInformation,
|
||||
XFileStandardInformation,
|
||||
XFileInternalInformation,
|
||||
XFileEaInformation,
|
||||
XFileAccessInformation,
|
||||
XFileNameInformation,
|
||||
XFileRenameInformation,
|
||||
XFileLinkInformation,
|
||||
XFileNamesInformation,
|
||||
XFileDispositionInformation,
|
||||
XFilePositionInformation,
|
||||
XFileFullEaInformation,
|
||||
XFileModeInformation,
|
||||
XFileAlignmentInformation,
|
||||
XFileAllInformation,
|
||||
XFileAllocationInformation,
|
||||
XFileEndOfFileInformation,
|
||||
XFileAlternateNameInformation,
|
||||
XFileStreamInformation,
|
||||
XFilePipeInformation,
|
||||
XFilePipeLocalInformation,
|
||||
XFilePipeRemoteInformation,
|
||||
XFileMailslotQueryInformation,
|
||||
XFileMailslotSetInformation,
|
||||
XFileCompressionInformation,
|
||||
XFileObjectIdInformation,
|
||||
XFileCompletionInformation,
|
||||
XFileMoveClusterInformation,
|
||||
XFileQuotaInformation,
|
||||
XFileReparsePointInformation,
|
||||
XFileNetworkOpenInformation,
|
||||
XFileAttributeTagInformation,
|
||||
XFileTrackingInformation,
|
||||
XFileIdBothDirectoryInformation,
|
||||
XFileIdFullDirectoryInformation,
|
||||
XFileValidDataLengthInformation,
|
||||
XFileShortNameInformation,
|
||||
XFileIoCompletionNotificationInformation,
|
||||
XFileIoStatusBlockRangeInformation,
|
||||
XFileIoPriorityHintInformation,
|
||||
XFileSfioReserveInformation,
|
||||
XFileSfioVolumeInformation,
|
||||
XFileHardLinkInformation,
|
||||
XFileProcessIdsUsingFileInformation,
|
||||
XFileNormalizedNameInformation,
|
||||
XFileNetworkPhysicalNameInformation,
|
||||
XFileIdGlobalTxDirectoryInformation,
|
||||
XFileIsRemoteDeviceInformation,
|
||||
XFileAttributeCacheInformation,
|
||||
XFileNumaNodeInformation,
|
||||
XFileStandardLinkInformation,
|
||||
XFileRemoteProtocolInformation,
|
||||
XFileReplaceCompletionInformation,
|
||||
XFileMaximumInformation
|
||||
} X_FILE_INFORMATION_CLASS;
|
||||
|
||||
|
||||
class X_ANSI_STRING {
|
||||
public:
|
||||
uint16_t length;
|
||||
uint16_t maximum_length;
|
||||
char* buffer;
|
||||
|
||||
X_ANSI_STRING() {
|
||||
Zero();
|
||||
}
|
||||
X_ANSI_STRING(const uint8_t* base, uint32_t p) {
|
||||
Read(base, p);
|
||||
}
|
||||
void Read(const uint8_t* base, uint32_t p) {
|
||||
length = XEGETUINT16BE(base + p);
|
||||
maximum_length = XEGETUINT16BE(base + p + 2);
|
||||
if (maximum_length) {
|
||||
buffer = (char*)(base + XEGETUINT32BE(base + p + 4));
|
||||
} else {
|
||||
buffer = 0;
|
||||
}
|
||||
}
|
||||
void Zero() {
|
||||
length = maximum_length = 0;
|
||||
buffer = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class X_OBJECT_ATTRIBUTES {
|
||||
public:
|
||||
uint32_t root_directory;
|
||||
uint32_t object_name_ptr;
|
||||
X_ANSI_STRING object_name;
|
||||
uint32_t attributes;
|
||||
|
||||
X_OBJECT_ATTRIBUTES() {
|
||||
Zero();
|
||||
}
|
||||
X_OBJECT_ATTRIBUTES(const uint8_t* base, uint32_t p) {
|
||||
Read(base, p);
|
||||
}
|
||||
void Read(const uint8_t* base, uint32_t p) {
|
||||
root_directory = XEGETUINT32BE(base + p);
|
||||
object_name_ptr = XEGETUINT32BE(base + p + 4);
|
||||
if (object_name_ptr) {
|
||||
object_name.Read(base, object_name_ptr);
|
||||
} else {
|
||||
object_name.Zero();
|
||||
}
|
||||
attributes = XEGETUINT32BE(base + p + 8);
|
||||
}
|
||||
void Zero() {
|
||||
root_directory = 0;
|
||||
object_name_ptr = 0;
|
||||
object_name.Zero();
|
||||
attributes = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // namespace xe
|
||||
|
||||
|
||||
#endif // XENIA_XBOX_H_
|
||||
Reference in New Issue
Block a user