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:
parent
c996a4bbaf
commit
b7ffd46319
|
@ -1,15 +1,19 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/gpu/xenos/ucode.h>
|
#ifndef XENIA_APU_APU_PRIVATE_H_
|
||||||
|
#define XENIA_APU_APU_PRIVATE_H_
|
||||||
|
|
||||||
using namespace xe;
|
#include <gflags/gflags.h>
|
||||||
using namespace xe::gpu;
|
|
||||||
using namespace xe::gpu::xenos;
|
|
||||||
|
DECLARE_string(apu);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_APU_PRIVATE_H_
|
|
@ -0,0 +1,39 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/apu.h>
|
||||||
|
#include <xenia/apu/apu-private.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
|
||||||
|
|
||||||
|
DEFINE_string(apu, "any",
|
||||||
|
"Audio system. Use: [any, nop]");
|
||||||
|
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_apu.h>
|
||||||
|
AudioSystem* xe::apu::CreateNop(Emulator* emulator) {
|
||||||
|
return xe::apu::nop::Create(emulator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AudioSystem* xe::apu::Create(Emulator* emulator) {
|
||||||
|
if (FLAGS_apu.compare("nop") == 0) {
|
||||||
|
return CreateNop(emulator);
|
||||||
|
} else {
|
||||||
|
// Create best available.
|
||||||
|
AudioSystem* best = NULL;
|
||||||
|
|
||||||
|
// Fallback to nop.
|
||||||
|
return CreateNop(emulator);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_APU_H_
|
||||||
|
#define XENIA_APU_APU_H_
|
||||||
|
|
||||||
|
#include <xenia/apu/audio_system.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
|
||||||
|
|
||||||
|
AudioSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
|
AudioSystem* CreateNop(Emulator* emulator);
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_APU_H_
|
|
@ -0,0 +1,23 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/audio_driver.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
|
||||||
|
|
||||||
|
AudioDriver::AudioDriver(xe_memory_ref memory) {
|
||||||
|
memory_ = xe_memory_retain(memory);
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioDriver::~AudioDriver() {
|
||||||
|
xe_memory_release(memory_);
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_AUDIO_DRIVER_H_
|
||||||
|
#define XENIA_APU_AUDIO_DRIVER_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
|
||||||
|
|
||||||
|
class AudioDriver {
|
||||||
|
public:
|
||||||
|
virtual ~AudioDriver();
|
||||||
|
|
||||||
|
xe_memory_ref memory() const { return memory_; }
|
||||||
|
|
||||||
|
virtual void Initialize() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AudioDriver(xe_memory_ref memory);
|
||||||
|
|
||||||
|
xe_memory_ref memory_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_AUDIO_DRIVER_H_
|
|
@ -0,0 +1,116 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/audio_system.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
|
#include <xenia/cpu/processor.h>
|
||||||
|
#include <xenia/apu/audio_driver.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
using namespace xe::cpu::ppc;
|
||||||
|
|
||||||
|
|
||||||
|
AudioSystem::AudioSystem(Emulator* emulator) :
|
||||||
|
emulator_(emulator),
|
||||||
|
thread_(0), running_(false), driver_(0) {
|
||||||
|
memory_ = xe_memory_retain(emulator->memory());
|
||||||
|
|
||||||
|
// Create the run loop used for any windows/etc.
|
||||||
|
// This must be done on the thread we create the driver.
|
||||||
|
run_loop_ = xe_run_loop_create();
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioSystem::~AudioSystem() {
|
||||||
|
// TODO(benvanik): thread join.
|
||||||
|
running_ = false;
|
||||||
|
xe_thread_release(thread_);
|
||||||
|
|
||||||
|
xe_run_loop_release(run_loop_);
|
||||||
|
xe_memory_release(memory_);
|
||||||
|
}
|
||||||
|
|
||||||
|
X_STATUS AudioSystem::Setup() {
|
||||||
|
processor_ = emulator_->processor();
|
||||||
|
|
||||||
|
// Let the processor know we want register access callbacks.
|
||||||
|
RegisterAccessCallbacks callbacks;
|
||||||
|
callbacks.context = this;
|
||||||
|
callbacks.handles = (RegisterHandlesCallback)HandlesRegisterThunk;
|
||||||
|
callbacks.read = (RegisterReadCallback)ReadRegisterThunk;
|
||||||
|
callbacks.write = (RegisterWriteCallback)WriteRegisterThunk;
|
||||||
|
emulator_->processor()->AddRegisterAccessCallbacks(callbacks);
|
||||||
|
|
||||||
|
// Create worker thread.
|
||||||
|
// This will initialize the audio system.
|
||||||
|
// Init needs to happen there so that any thread-local stuff
|
||||||
|
// is created on the right thread.
|
||||||
|
running_ = true;
|
||||||
|
thread_ = xe_thread_create(
|
||||||
|
"AudioSystem",
|
||||||
|
(xe_thread_callback)ThreadStartThunk, this);
|
||||||
|
xe_thread_start(thread_);
|
||||||
|
|
||||||
|
return X_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioSystem::ThreadStart() {
|
||||||
|
xe_run_loop_ref run_loop = xe_run_loop_retain(run_loop_);
|
||||||
|
|
||||||
|
// Initialize driver and ringbuffer.
|
||||||
|
Initialize();
|
||||||
|
XEASSERTNOTNULL(driver_);
|
||||||
|
|
||||||
|
// Main run loop.
|
||||||
|
while (running_) {
|
||||||
|
// Peek main run loop.
|
||||||
|
if (xe_run_loop_pump(run_loop)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!running_) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pump worker.
|
||||||
|
//worker_->Pump();
|
||||||
|
|
||||||
|
// Pump audio system.
|
||||||
|
Pump();
|
||||||
|
}
|
||||||
|
running_ = false;
|
||||||
|
|
||||||
|
Shutdown();
|
||||||
|
|
||||||
|
xe_run_loop_release(run_loop);
|
||||||
|
|
||||||
|
// TODO(benvanik): call module API to kill?
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioSystem::Initialize() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioSystem::Shutdown() {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AudioSystem::HandlesRegister(uint32_t addr) {
|
||||||
|
return (addr & 0xFFFF0000) == 0x7FEA0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t AudioSystem::ReadRegister(uint32_t addr) {
|
||||||
|
uint32_t r = addr & 0xFFFF;
|
||||||
|
XELOGAPU("ReadRegister(%.4X)", r);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioSystem::WriteRegister(uint32_t addr, uint64_t value) {
|
||||||
|
uint32_t r = addr & 0xFFFF;
|
||||||
|
XELOGAPU("WriteRegister(%.4X, %.8X)", r, value);
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_AUDIO_SYSTEM_H_
|
||||||
|
#define XENIA_APU_AUDIO_SYSTEM_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
XEDECLARECLASS2(xe, cpu, Processor);
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
|
||||||
|
class AudioDriver;
|
||||||
|
|
||||||
|
|
||||||
|
class AudioSystem {
|
||||||
|
public:
|
||||||
|
virtual ~AudioSystem();
|
||||||
|
|
||||||
|
Emulator* emulator() const { return emulator_; }
|
||||||
|
xe_memory_ref memory() const { return memory_; }
|
||||||
|
cpu::Processor* processor() const { return processor_; }
|
||||||
|
|
||||||
|
virtual X_STATUS Setup();
|
||||||
|
|
||||||
|
bool HandlesRegister(uint32_t addr);
|
||||||
|
virtual uint64_t ReadRegister(uint32_t addr);
|
||||||
|
virtual void WriteRegister(uint32_t addr, uint64_t value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void Initialize();
|
||||||
|
virtual void Pump() = 0;
|
||||||
|
virtual void Shutdown();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void ThreadStartThunk(AudioSystem* this_ptr) {
|
||||||
|
this_ptr->ThreadStart();
|
||||||
|
}
|
||||||
|
void ThreadStart();
|
||||||
|
|
||||||
|
static bool HandlesRegisterThunk(AudioSystem* as, uint32_t addr) {
|
||||||
|
return as->HandlesRegister(addr);
|
||||||
|
}
|
||||||
|
static uint64_t ReadRegisterThunk(AudioSystem* as, uint32_t addr) {
|
||||||
|
return as->ReadRegister(addr);
|
||||||
|
}
|
||||||
|
static void WriteRegisterThunk(AudioSystem* as, uint32_t addr,
|
||||||
|
uint64_t value) {
|
||||||
|
as->WriteRegister(addr, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
AudioSystem(Emulator* emulator);
|
||||||
|
|
||||||
|
Emulator* emulator_;
|
||||||
|
xe_memory_ref memory_;
|
||||||
|
cpu::Processor* processor_;
|
||||||
|
|
||||||
|
xe_run_loop_ref run_loop_;
|
||||||
|
xe_thread_ref thread_;
|
||||||
|
bool running_;
|
||||||
|
|
||||||
|
AudioDriver* driver_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_AUDIO_SYSTEM_H_
|
|
@ -0,0 +1,31 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_NOP_NOP_APU_PRIVATE_H_
|
||||||
|
#define XENIA_APU_NOP_NOP_APU_PRIVATE_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_apu.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace nop
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_NOP_NOP_APU_PRIVATE_H_
|
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_apu.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_audio_system.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
using namespace xe::apu::nop;
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
void InitializeIfNeeded();
|
||||||
|
void CleanupOnShutdown();
|
||||||
|
|
||||||
|
void InitializeIfNeeded() {
|
||||||
|
static bool has_initialized = false;
|
||||||
|
if (has_initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
has_initialized = true;
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
atexit(CleanupOnShutdown);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanupOnShutdown() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AudioSystem* xe::apu::nop::Create(Emulator* emulator) {
|
||||||
|
InitializeIfNeeded();
|
||||||
|
return new NopAudioSystem(emulator);
|
||||||
|
}
|
|
@ -1,33 +1,33 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_GPU_NOP_NOP_H_
|
#ifndef XENIA_GPU_NOP_NOP_H_
|
||||||
#define XENIA_GPU_NOP_NOP_H_
|
#define XENIA_GPU_NOP_NOP_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
namespace gpu {
|
XEDECLARECLASS2(xe, apu, AudioSystem);
|
||||||
|
|
||||||
class CreationParams;
|
|
||||||
class GraphicsSystem;
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
namespace nop {
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* Create(const CreationParams* params);
|
AudioSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
|
|
||||||
} // namespace nop
|
} // namespace nop
|
||||||
} // namespace gpu
|
} // namespace apu
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_GPU_NOP_NOP_H_
|
#endif // XENIA_GPU_NOP_NOP_H_
|
|
@ -0,0 +1,28 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_audio_driver.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/apu-private.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
using namespace xe::apu::nop;
|
||||||
|
|
||||||
|
|
||||||
|
NopAudioDriver::NopAudioDriver(xe_memory_ref memory) :
|
||||||
|
AudioDriver(memory) {
|
||||||
|
}
|
||||||
|
|
||||||
|
NopAudioDriver::~NopAudioDriver() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void NopAudioDriver::Initialize() {
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_NOP_NOP_AUDIO_DRIVER_H_
|
||||||
|
#define XENIA_APU_NOP_NOP_AUDIO_DRIVER_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/audio_driver.h>
|
||||||
|
#include <xenia/apu/nop/nop_apu-private.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
|
class NopAudioDriver : public AudioDriver {
|
||||||
|
public:
|
||||||
|
NopAudioDriver(xe_memory_ref memory);
|
||||||
|
virtual ~NopAudioDriver();
|
||||||
|
|
||||||
|
virtual void Initialize();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace nop
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_NOP_NOP_AUDIO_DRIVER_H_
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/apu/nop/nop_audio_system.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/apu-private.h>
|
||||||
|
#include <xenia/apu/nop/nop_audio_driver.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
using namespace xe::apu::nop;
|
||||||
|
|
||||||
|
|
||||||
|
NopAudioSystem::NopAudioSystem(Emulator* emulator) :
|
||||||
|
AudioSystem(emulator) {
|
||||||
|
}
|
||||||
|
|
||||||
|
NopAudioSystem::~NopAudioSystem() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void NopAudioSystem::Initialize() {
|
||||||
|
AudioSystem::Initialize();
|
||||||
|
|
||||||
|
XEASSERTNULL(driver_);
|
||||||
|
driver_ = new NopAudioDriver(memory_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NopAudioSystem::Pump() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void NopAudioSystem::Shutdown() {
|
||||||
|
AudioSystem::Shutdown();
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_APU_NOP_NOP_AUDIO_SYSTEM_H_
|
||||||
|
#define XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/audio_system.h>
|
||||||
|
#include <xenia/apu/nop/nop_apu-private.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace apu {
|
||||||
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
|
class NopAudioSystem : public AudioSystem {
|
||||||
|
public:
|
||||||
|
NopAudioSystem(Emulator* emulator);
|
||||||
|
virtual ~NopAudioSystem();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void Initialize();
|
||||||
|
virtual void Pump();
|
||||||
|
virtual void Shutdown();
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace nop
|
||||||
|
} // namespace apu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_
|
|
@ -0,0 +1,12 @@
|
||||||
|
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||||
|
{
|
||||||
|
'sources': [
|
||||||
|
'nop_apu-private.h',
|
||||||
|
'nop_apu.cc',
|
||||||
|
'nop_apu.h',
|
||||||
|
'nop_audio_driver.cc',
|
||||||
|
'nop_audio_driver.h',
|
||||||
|
'nop_audio_system.cc',
|
||||||
|
'nop_audio_system.h',
|
||||||
|
],
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||||
|
{
|
||||||
|
'sources': [
|
||||||
|
'apu-private.h',
|
||||||
|
'apu.cc',
|
||||||
|
'apu.h',
|
||||||
|
'audio_driver.cc',
|
||||||
|
'audio_driver.h',
|
||||||
|
'audio_system.cc',
|
||||||
|
'audio_system.h',
|
||||||
|
],
|
||||||
|
|
||||||
|
'includes': [
|
||||||
|
'nop/sources.gypi',
|
||||||
|
],
|
||||||
|
|
||||||
|
'conditions': [
|
||||||
|
['OS == "win"', {
|
||||||
|
'includes': [
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
}
|
|
@ -24,6 +24,7 @@
|
||||||
#define XE_OPTION_LOG_DEBUG 1
|
#define XE_OPTION_LOG_DEBUG 1
|
||||||
#define XE_OPTION_LOG_CPU 1
|
#define XE_OPTION_LOG_CPU 1
|
||||||
#define XE_OPTION_LOG_SDB 0
|
#define XE_OPTION_LOG_SDB 0
|
||||||
|
#define XE_OPTION_LOG_APU 1
|
||||||
#define XE_OPTION_LOG_GPU 1
|
#define XE_OPTION_LOG_GPU 1
|
||||||
#define XE_OPTION_LOG_KERNEL 1
|
#define XE_OPTION_LOG_KERNEL 1
|
||||||
#define XE_OPTION_LOG_FS 1
|
#define XE_OPTION_LOG_FS 1
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <xenia/core/crc32.h>
|
#include <xenia/core/crc32.h>
|
||||||
#include <xenia/core/file.h>
|
#include <xenia/core/file.h>
|
||||||
#include <xenia/core/hash.h>
|
#include <xenia/core/hash.h>
|
||||||
#include <xenia/core/memory.h>
|
#include <xenia/memory.h>
|
||||||
#include <xenia/core/mmap.h>
|
#include <xenia/core/mmap.h>
|
||||||
#include <xenia/core/mutex.h>
|
#include <xenia/core/mutex.h>
|
||||||
#include <xenia/core/pal.h>
|
#include <xenia/core/pal.h>
|
||||||
|
|
|
@ -7,8 +7,6 @@
|
||||||
'file.h',
|
'file.h',
|
||||||
'hash.cc',
|
'hash.cc',
|
||||||
'hash.h',
|
'hash.h',
|
||||||
'memory.cc',
|
|
||||||
'memory.h',
|
|
||||||
'mmap.h',
|
'mmap.h',
|
||||||
'mutex.h',
|
'mutex.h',
|
||||||
'pal.h',
|
'pal.h',
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
|
|
||||||
#include <xenia/core/memory.h>
|
#include <xenia/memory.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
|
|
@ -16,11 +16,10 @@
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
ExecModule::ExecModule(
|
ExecModule::ExecModule(
|
||||||
xe_memory_ref memory, shared_ptr<ExportResolver> export_resolver,
|
xe_memory_ref memory, ExportResolver* export_resolver,
|
||||||
SymbolTable* sym_table,
|
SymbolTable* sym_table,
|
||||||
const char* module_name, const char* module_path) {
|
const char* module_name, const char* module_path) {
|
||||||
memory_ = xe_memory_retain(memory);
|
memory_ = xe_memory_retain(memory);
|
||||||
|
@ -42,7 +41,7 @@ SymbolDatabase* ExecModule::sdb() {
|
||||||
|
|
||||||
int ExecModule::PrepareRawBinary(uint32_t start_address, uint32_t end_address) {
|
int ExecModule::PrepareRawBinary(uint32_t start_address, uint32_t end_address) {
|
||||||
sdb_ = shared_ptr<sdb::SymbolDatabase>(
|
sdb_ = shared_ptr<sdb::SymbolDatabase>(
|
||||||
new sdb::RawSymbolDatabase(memory_, export_resolver_.get(),
|
new sdb::RawSymbolDatabase(memory_, export_resolver_,
|
||||||
sym_table_, start_address, end_address));
|
sym_table_, start_address, end_address));
|
||||||
|
|
||||||
code_addr_low_ = start_address;
|
code_addr_low_ = start_address;
|
||||||
|
@ -53,7 +52,7 @@ int ExecModule::PrepareRawBinary(uint32_t start_address, uint32_t end_address) {
|
||||||
|
|
||||||
int ExecModule::PrepareXexModule(xe_xex2_ref xex) {
|
int ExecModule::PrepareXexModule(xe_xex2_ref xex) {
|
||||||
sdb_ = shared_ptr<sdb::SymbolDatabase>(
|
sdb_ = shared_ptr<sdb::SymbolDatabase>(
|
||||||
new sdb::XexSymbolDatabase(memory_, export_resolver_.get(),
|
new sdb::XexSymbolDatabase(memory_, export_resolver_,
|
||||||
sym_table_, xex));
|
sym_table_, xex));
|
||||||
|
|
||||||
code_addr_low_ = UINT_MAX;
|
code_addr_low_ = UINT_MAX;
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/cpu/sdb.h>
|
#include <xenia/cpu/sdb.h>
|
||||||
#include <xenia/kernel/export.h>
|
|
||||||
#include <xenia/kernel/xex2.h>
|
#include <xenia/kernel/xex2.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ namespace cpu {
|
||||||
class ExecModule {
|
class ExecModule {
|
||||||
public:
|
public:
|
||||||
ExecModule(
|
ExecModule(
|
||||||
xe_memory_ref memory, shared_ptr<kernel::ExportResolver> export_resolver,
|
xe_memory_ref memory, ExportResolver* export_resolver,
|
||||||
sdb::SymbolTable* sym_table,
|
sdb::SymbolTable* sym_table,
|
||||||
const char* module_name, const char* module_path);
|
const char* module_name, const char* module_path);
|
||||||
~ExecModule();
|
~ExecModule();
|
||||||
|
@ -43,11 +43,11 @@ private:
|
||||||
int Prepare();
|
int Prepare();
|
||||||
int Init();
|
int Init();
|
||||||
|
|
||||||
xe_memory_ref memory_;
|
xe_memory_ref memory_;
|
||||||
shared_ptr<kernel::ExportResolver> export_resolver_;
|
ExportResolver* export_resolver_;
|
||||||
sdb::SymbolTable* sym_table_;
|
sdb::SymbolTable* sym_table_;
|
||||||
char* module_name_;
|
char* module_name_;
|
||||||
char* module_path_;
|
char* module_path_;
|
||||||
|
|
||||||
shared_ptr<sdb::SymbolDatabase> sdb_;
|
shared_ptr<sdb::SymbolDatabase> sdb_;
|
||||||
uint32_t code_addr_low_;
|
uint32_t code_addr_low_;
|
||||||
|
|
|
@ -15,13 +15,12 @@
|
||||||
#include <xenia/cpu/sdb.h>
|
#include <xenia/cpu/sdb.h>
|
||||||
#include <xenia/cpu/ppc/instr.h>
|
#include <xenia/cpu/ppc/instr.h>
|
||||||
#include <xenia/cpu/ppc/state.h>
|
#include <xenia/cpu/ppc/state.h>
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/cpu/ppc/state.h>
|
#include <xenia/cpu/ppc/state.h>
|
||||||
#include <xenia/cpu/sdb/symbol.h>
|
#include <xenia/cpu/sdb/symbol.h>
|
||||||
#include <xenia/kernel/export.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -33,7 +33,7 @@ typedef struct {
|
||||||
xe_ppc_state_t* state, uint64_t cia, uint64_t ea);
|
xe_ppc_state_t* state, uint64_t cia, uint64_t ea);
|
||||||
void (_cdecl *XeTraceKernelCall)(
|
void (_cdecl *XeTraceKernelCall)(
|
||||||
xe_ppc_state_t* state, uint64_t cia, uint64_t call_ia,
|
xe_ppc_state_t* state, uint64_t cia, uint64_t call_ia,
|
||||||
kernel::KernelExport* kernel_export);
|
KernelExport* kernel_export);
|
||||||
void (_cdecl *XeTraceUserCall)(
|
void (_cdecl *XeTraceUserCall)(
|
||||||
xe_ppc_state_t* state, uint64_t cia, uint64_t call_ia,
|
xe_ppc_state_t* state, uint64_t cia, uint64_t call_ia,
|
||||||
sdb::FunctionSymbol* fn);
|
sdb::FunctionSymbol* fn);
|
||||||
|
|
|
@ -30,8 +30,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int Setup() = 0;
|
virtual int Setup() = 0;
|
||||||
virtual void SetupGpuPointers(void* gpu_this,
|
virtual void AddRegisterAccessCallbacks(
|
||||||
void* gpu_read, void* gpu_write) = 0;
|
ppc::RegisterAccessCallbacks callbacks) = 0;
|
||||||
|
|
||||||
virtual int InitModule(ExecModule* module) = 0;
|
virtual int InitModule(ExecModule* module) = 0;
|
||||||
virtual int UninitModule(ExecModule* module) = 0;
|
virtual int UninitModule(ExecModule* module) = 0;
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
|
|
||||||
#include <xenia/cpu/ppc/instr.h>
|
#include <xenia/cpu/ppc/instr.h>
|
||||||
|
#include <xenia/cpu/ppc/registers.h>
|
||||||
#include <xenia/cpu/ppc/state.h>
|
#include <xenia/cpu/ppc/state.h>
|
||||||
|
|
||||||
#endif // XENIA_CPU_PPC_H_
|
#endif // XENIA_CPU_PPC_H_
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_CPU_PPC_REGISTERS_H_
|
||||||
|
#define XENIA_CPU_PPC_REGISTERS_H_
|
||||||
|
|
||||||
|
#include <xenia/common.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace cpu {
|
||||||
|
namespace ppc {
|
||||||
|
|
||||||
|
|
||||||
|
typedef bool (*RegisterHandlesCallback)(void* context, uint32_t addr);
|
||||||
|
typedef uint64_t (*RegisterReadCallback)(void* context, uint32_t addr);
|
||||||
|
typedef void (*RegisterWriteCallback)(void* context, uint32_t addr,
|
||||||
|
uint64_t value);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void* context;
|
||||||
|
RegisterHandlesCallback handles;
|
||||||
|
RegisterReadCallback read;
|
||||||
|
RegisterWriteCallback write;
|
||||||
|
} RegisterAccessCallbacks;
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace ppc
|
||||||
|
} // namespace cpu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_CPU_PPC_REGISTERS_H_
|
|
@ -10,6 +10,7 @@
|
||||||
'instr.cc',
|
'instr.cc',
|
||||||
'instr.h',
|
'instr.h',
|
||||||
'instr_tables.h',
|
'instr_tables.h',
|
||||||
|
'registers.h',
|
||||||
'state.cc',
|
'state.cc',
|
||||||
'state.h',
|
'state.h',
|
||||||
],
|
],
|
||||||
|
|
|
@ -13,12 +13,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
XEDECLARECLASS2(xe, cpu, Processor);
|
||||||
namespace cpu {
|
XEDECLARECLASS2(xe, cpu, ThreadState);
|
||||||
class Processor;
|
|
||||||
class ThreadState;
|
|
||||||
} // namespace cpu
|
|
||||||
} // namespace xe
|
|
||||||
|
|
||||||
|
|
||||||
// namespace FPRF {
|
// namespace FPRF {
|
||||||
|
|
|
@ -9,16 +9,15 @@
|
||||||
|
|
||||||
#include <xenia/cpu/processor.h>
|
#include <xenia/cpu/processor.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
#include <xenia/cpu/jit.h>
|
#include <xenia/cpu/jit.h>
|
||||||
#include <xenia/cpu/ppc/disasm.h>
|
#include <xenia/cpu/ppc/disasm.h>
|
||||||
#include <xenia/cpu/ppc/state.h>
|
#include <xenia/cpu/ppc/state.h>
|
||||||
#include <xenia/gpu/graphics_system.h>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -46,11 +45,14 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Processor::Processor(xe_memory_ref memory, shared_ptr<Backend> backend) :
|
Processor::Processor(Emulator* emulator, Backend* backend) :
|
||||||
sym_table_(NULL), jit_(NULL),
|
sym_table_(NULL), jit_(NULL),
|
||||||
interrupt_thread_lock_(NULL), interrupt_thread_state_(NULL) {
|
interrupt_thread_lock_(NULL), interrupt_thread_state_(NULL) {
|
||||||
memory_ = xe_memory_retain(memory);
|
emulator_ = emulator;
|
||||||
backend_ = backend;
|
backend_ = backend;
|
||||||
|
memory_ = xe_memory_retain(emulator->memory());
|
||||||
|
export_resolver_ = emulator->export_resolver();
|
||||||
|
|
||||||
sym_lock_ = xe_mutex_alloc(10000);
|
sym_lock_ = xe_mutex_alloc(10000);
|
||||||
|
|
||||||
InitializeIfNeeded();
|
InitializeIfNeeded();
|
||||||
|
@ -76,34 +78,9 @@ Processor::~Processor() {
|
||||||
delete sym_table_;
|
delete sym_table_;
|
||||||
xe_mutex_free(sym_lock_);
|
xe_mutex_free(sym_lock_);
|
||||||
|
|
||||||
graphics_system_.reset();
|
|
||||||
export_resolver_.reset();
|
|
||||||
backend_.reset();
|
|
||||||
xe_memory_release(memory_);
|
xe_memory_release(memory_);
|
||||||
}
|
}
|
||||||
|
|
||||||
xe_memory_ref Processor::memory() {
|
|
||||||
return xe_memory_retain(memory_);
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<gpu::GraphicsSystem> Processor::graphics_system() {
|
|
||||||
return graphics_system_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Processor::set_graphics_system(
|
|
||||||
shared_ptr<gpu::GraphicsSystem> graphics_system) {
|
|
||||||
graphics_system_ = graphics_system;
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<ExportResolver> Processor::export_resolver() {
|
|
||||||
return export_resolver_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Processor::set_export_resolver(
|
|
||||||
shared_ptr<ExportResolver> export_resolver) {
|
|
||||||
export_resolver_ = export_resolver;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Processor::Setup() {
|
int Processor::Setup() {
|
||||||
XEASSERTNULL(jit_);
|
XEASSERTNULL(jit_);
|
||||||
|
|
||||||
|
@ -121,15 +98,15 @@ int Processor::Setup() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
XEASSERTNOTNULL(graphics_system_.get());
|
|
||||||
jit_->SetupGpuPointers(
|
|
||||||
graphics_system_.get(),
|
|
||||||
(void*)&xe::gpu::GraphicsSystem::ReadRegisterThunk,
|
|
||||||
(void*)&xe::gpu::GraphicsSystem::WriteRegisterThunk);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Processor::AddRegisterAccessCallbacks(
|
||||||
|
ppc::RegisterAccessCallbacks callbacks) {
|
||||||
|
XEASSERTNOTNULL(jit_);
|
||||||
|
jit_->AddRegisterAccessCallbacks(callbacks);
|
||||||
|
}
|
||||||
|
|
||||||
int Processor::LoadRawBinary(const xechar_t* path, uint32_t start_address) {
|
int Processor::LoadRawBinary(const xechar_t* path, uint32_t start_address) {
|
||||||
ExecModule* exec_module = NULL;
|
ExecModule* exec_module = NULL;
|
||||||
const xechar_t* name = xestrrchr(path, XE_PATH_SEPARATOR) + 1;
|
const xechar_t* name = xestrrchr(path, XE_PATH_SEPARATOR) + 1;
|
||||||
|
|
|
@ -18,15 +18,10 @@
|
||||||
#include <xenia/cpu/exec_module.h>
|
#include <xenia/cpu/exec_module.h>
|
||||||
#include <xenia/cpu/thread_state.h>
|
#include <xenia/cpu/thread_state.h>
|
||||||
#include <xenia/cpu/sdb/symbol_table.h>
|
#include <xenia/cpu/sdb/symbol_table.h>
|
||||||
#include <xenia/kernel/export.h>
|
|
||||||
#include <xenia/kernel/xex2.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
namespace gpu {
|
XEDECLARECLASS1(xe, ExportResolver);
|
||||||
class GraphicsSystem;
|
|
||||||
} // namespace gpu
|
|
||||||
} // namespace xe
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -37,17 +32,16 @@ class JIT;
|
||||||
|
|
||||||
class Processor {
|
class Processor {
|
||||||
public:
|
public:
|
||||||
Processor(xe_memory_ref memory, shared_ptr<Backend> backend);
|
Processor(Emulator* emulator, Backend* backend);
|
||||||
~Processor();
|
~Processor();
|
||||||
|
|
||||||
xe_memory_ref memory();
|
xe_memory_ref memory() const { return memory_; }
|
||||||
shared_ptr<gpu::GraphicsSystem> graphics_system();
|
ExportResolver* export_resolver() const { return export_resolver_; }
|
||||||
void set_graphics_system(shared_ptr<gpu::GraphicsSystem> graphics_system);
|
|
||||||
shared_ptr<kernel::ExportResolver> export_resolver();
|
|
||||||
void set_export_resolver(shared_ptr<kernel::ExportResolver> export_resolver);
|
|
||||||
|
|
||||||
int Setup();
|
int Setup();
|
||||||
|
|
||||||
|
void AddRegisterAccessCallbacks(ppc::RegisterAccessCallbacks callbacks);
|
||||||
|
|
||||||
int LoadRawBinary(const xechar_t* path, uint32_t start_address);
|
int LoadRawBinary(const xechar_t* path, uint32_t start_address);
|
||||||
int LoadXexModule(const char* name, const char* path, xe_xex2_ref xex);
|
int LoadXexModule(const char* name, const char* path, xe_xex2_ref xex);
|
||||||
|
|
||||||
|
@ -69,19 +63,19 @@ public:
|
||||||
void* GetFunctionPointer(uint32_t address);
|
void* GetFunctionPointer(uint32_t address);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
xe_memory_ref memory_;
|
Emulator* emulator_;
|
||||||
shared_ptr<Backend> backend_;
|
Backend* backend_;
|
||||||
shared_ptr<gpu::GraphicsSystem> graphics_system_;
|
xe_memory_ref memory_;
|
||||||
shared_ptr<kernel::ExportResolver> export_resolver_;
|
ExportResolver* export_resolver_;
|
||||||
|
|
||||||
sdb::SymbolTable* sym_table_;
|
sdb::SymbolTable* sym_table_;
|
||||||
JIT* jit_;
|
JIT* jit_;
|
||||||
std::vector<ExecModule*> modules_;
|
std::vector<ExecModule*> modules_;
|
||||||
xe_mutex_t* sym_lock_;
|
xe_mutex_t* sym_lock_;
|
||||||
|
|
||||||
xe_mutex_t* interrupt_thread_lock_;
|
xe_mutex_t* interrupt_thread_lock_;
|
||||||
ThreadState* interrupt_thread_state_;
|
ThreadState* interrupt_thread_state_;
|
||||||
uint32_t interrupt_thread_block_;
|
uint32_t interrupt_thread_block_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,6 @@ using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::ppc;
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
RawSymbolDatabase::RawSymbolDatabase(
|
RawSymbolDatabase::RawSymbolDatabase(
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace sdb {
|
||||||
class RawSymbolDatabase : public SymbolDatabase {
|
class RawSymbolDatabase : public SymbolDatabase {
|
||||||
public:
|
public:
|
||||||
RawSymbolDatabase(xe_memory_ref memory,
|
RawSymbolDatabase(xe_memory_ref memory,
|
||||||
kernel::ExportResolver* export_resolver,
|
ExportResolver* export_resolver,
|
||||||
SymbolTable* sym_table,
|
SymbolTable* sym_table,
|
||||||
uint32_t start_address, uint32_t end_address);
|
uint32_t start_address, uint32_t end_address);
|
||||||
virtual ~RawSymbolDatabase();
|
virtual ~RawSymbolDatabase();
|
||||||
|
|
|
@ -17,7 +17,6 @@ using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::ppc;
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
Symbol::Symbol(SymbolType type) :
|
Symbol::Symbol(SymbolType type) :
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -125,7 +125,7 @@ public:
|
||||||
FunctionType type;
|
FunctionType type;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
kernel::KernelExport* kernel_export;
|
KernelExport* kernel_export;
|
||||||
ExceptionEntrySymbol* ee;
|
ExceptionEntrySymbol* ee;
|
||||||
|
|
||||||
// Implementation-specific value. This could be a JIT'ed function ref
|
// Implementation-specific value. This could be a JIT'ed function ref
|
||||||
|
@ -147,9 +147,9 @@ public:
|
||||||
VariableSymbol();
|
VariableSymbol();
|
||||||
virtual ~VariableSymbol();
|
virtual ~VariableSymbol();
|
||||||
|
|
||||||
uint32_t address;
|
uint32_t address;
|
||||||
|
|
||||||
kernel::KernelExport* kernel_export;
|
KernelExport* kernel_export;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ExceptionEntrySymbol : public Symbol {
|
class ExceptionEntrySymbol : public Symbol {
|
||||||
|
|
|
@ -20,12 +20,12 @@ using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::ppc;
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
SymbolDatabase::SymbolDatabase(xe_memory_ref memory,
|
SymbolDatabase::SymbolDatabase(xe_memory_ref memory,
|
||||||
ExportResolver* export_resolver,
|
ExportResolver* export_resolver,
|
||||||
SymbolTable* sym_table) {
|
SymbolTable* sym_table) :
|
||||||
|
function_count_(0), variable_count_(0) {
|
||||||
memory_ = xe_memory_retain(memory);
|
memory_ = xe_memory_retain(memory);
|
||||||
export_resolver_ = export_resolver;
|
export_resolver_ = export_resolver;
|
||||||
sym_table_ = sym_table;
|
sym_table_ = sym_table;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/cpu/sdb/symbol.h>
|
#include <xenia/cpu/sdb/symbol.h>
|
||||||
#include <xenia/cpu/sdb/symbol_table.h>
|
#include <xenia/cpu/sdb/symbol_table.h>
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ namespace sdb {
|
||||||
|
|
||||||
class SymbolDatabase {
|
class SymbolDatabase {
|
||||||
public:
|
public:
|
||||||
SymbolDatabase(xe_memory_ref memory, kernel::ExportResolver* export_resolver,
|
SymbolDatabase(xe_memory_ref memory, ExportResolver* export_resolver,
|
||||||
SymbolTable* sym_table);
|
SymbolTable* sym_table);
|
||||||
virtual ~SymbolDatabase();
|
virtual ~SymbolDatabase();
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ protected:
|
||||||
virtual bool IsValueInTextRange(uint32_t value) = 0;
|
virtual bool IsValueInTextRange(uint32_t value) = 0;
|
||||||
|
|
||||||
xe_memory_ref memory_;
|
xe_memory_ref memory_;
|
||||||
kernel::ExportResolver* export_resolver_;
|
ExportResolver* export_resolver_;
|
||||||
SymbolTable* sym_table_;
|
SymbolTable* sym_table_;
|
||||||
size_t function_count_;
|
size_t function_count_;
|
||||||
size_t variable_count_;
|
size_t variable_count_;
|
||||||
|
|
|
@ -17,7 +17,6 @@ using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
using namespace xe::cpu::ppc;
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace sdb {
|
||||||
class XexSymbolDatabase : public SymbolDatabase {
|
class XexSymbolDatabase : public SymbolDatabase {
|
||||||
public:
|
public:
|
||||||
XexSymbolDatabase(xe_memory_ref memory,
|
XexSymbolDatabase(xe_memory_ref memory,
|
||||||
kernel::ExportResolver* export_resolver,
|
ExportResolver* export_resolver,
|
||||||
SymbolTable* sym_table, xe_xex2_ref xex);
|
SymbolTable* sym_table, xe_xex2_ref xex);
|
||||||
virtual ~XexSymbolDatabase();
|
virtual ~XexSymbolDatabase();
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include <xenia/cpu/thread_state.h>
|
#include <xenia/cpu/thread_state.h>
|
||||||
|
|
||||||
#include <xenia/core/memory.h>
|
#include <xenia/memory.h>
|
||||||
#include <xenia/cpu/processor.h>
|
#include <xenia/cpu/processor.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -454,8 +454,8 @@ XEEMITTER(lwz, 0x80000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
uint64_t constant_ea;
|
uint64_t constant_ea;
|
||||||
if (i.D.RA && e.get_constant_gpr_value(i.D.RA, &constant_ea)) {
|
if (i.D.RA && e.get_constant_gpr_value(i.D.RA, &constant_ea)) {
|
||||||
constant_ea += XEEXTS16(i.D.DS);
|
constant_ea += XEEXTS16(i.D.DS);
|
||||||
if ((constant_ea & 0xFFFF0000) == 0x7FC80000) {
|
GpVar reg;
|
||||||
GpVar reg(e.read_gpu_register((uint32_t)constant_ea));
|
if (e.check_constant_gpr_read((uint32_t)constant_ea, ®)) {
|
||||||
e.update_gpr_value(i.D.RT, reg);
|
e.update_gpr_value(i.D.RT, reg);
|
||||||
e.clear_constant_gpr_value(i.D.RT);
|
e.clear_constant_gpr_value(i.D.RT);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -824,8 +824,7 @@ XEEMITTER(stw, 0x90000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
|
||||||
uint64_t constant_ea;
|
uint64_t constant_ea;
|
||||||
if (i.D.RA && e.get_constant_gpr_value(i.D.RA, &constant_ea)) {
|
if (i.D.RA && e.get_constant_gpr_value(i.D.RA, &constant_ea)) {
|
||||||
constant_ea += XEEXTS16(i.D.DS);
|
constant_ea += XEEXTS16(i.D.DS);
|
||||||
if ((constant_ea & 0xFFFF0000) == 0x7FC80000) {
|
if (e.check_constant_gpr_write((uint32_t)constant_ea, e.gpr_value(i.D.RT))) {
|
||||||
e.write_gpu_register((uint32_t)constant_ea, e.gpr_value(i.D.RT));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,11 +94,9 @@ X64Emitter::~X64Emitter() {
|
||||||
lock_ = NULL;
|
lock_ = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void X64Emitter::SetupGpuPointers(void* gpu_this,
|
void X64Emitter::AddRegisterAccessCallbacks(
|
||||||
void* gpu_read, void* gpu_write) {
|
RegisterAccessCallbacks callbacks) {
|
||||||
gpu_this_ = gpu_this;
|
access_callbacks_.push_back(callbacks);
|
||||||
gpu_read_ = gpu_read;
|
|
||||||
gpu_write_ = gpu_write;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void X64Emitter::Lock() {
|
void X64Emitter::Lock() {
|
||||||
|
@ -1155,44 +1153,6 @@ int X64Emitter::GenerateIndirectionBranch(uint32_t cia, GpVar& target,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GpVar X64Emitter::read_gpu_register(uint32_t r) {
|
|
||||||
X86Compiler& c = compiler_;
|
|
||||||
|
|
||||||
GpVar this_imm(c.newGpVar());
|
|
||||||
c.mov(this_imm, imm((uint64_t)gpu_this_));
|
|
||||||
GpVar reg_imm(c.newGpVar());
|
|
||||||
c.mov(reg_imm, imm(r & 0xFFFF));
|
|
||||||
|
|
||||||
X86CompilerFuncCall* call = c.call(gpu_read_);
|
|
||||||
call->setPrototype(kX86FuncConvDefault,
|
|
||||||
FuncBuilder2<uint64_t, void*, uint32_t>());
|
|
||||||
call->setArgument(0, this_imm);
|
|
||||||
call->setArgument(1, reg_imm);
|
|
||||||
GpVar res(c.newGpVar());
|
|
||||||
call->setReturn(res);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void X64Emitter::write_gpu_register(uint32_t r, GpVar& v) {
|
|
||||||
X86Compiler& c = compiler_;
|
|
||||||
|
|
||||||
GpVar this_imm(c.newGpVar());
|
|
||||||
c.alloc(this_imm, rcx);
|
|
||||||
c.mov(this_imm, imm((uint64_t)gpu_this_));
|
|
||||||
GpVar reg_imm(c.newGpVar());
|
|
||||||
c.alloc(reg_imm, rdx);
|
|
||||||
c.mov(reg_imm, imm(r & 0xFFFF));
|
|
||||||
c.alloc(v, r8);
|
|
||||||
|
|
||||||
X86CompilerFuncCall* call = c.call(gpu_write_);
|
|
||||||
call->setPrototype(kX86FuncConvDefault,
|
|
||||||
FuncBuilder3<void, void*, uint32_t, uint64_t>());
|
|
||||||
call->setArgument(0, this_imm);
|
|
||||||
call->setArgument(1, reg_imm);
|
|
||||||
call->setArgument(2, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
void X64Emitter::SetupLocals() {
|
void X64Emitter::SetupLocals() {
|
||||||
X86Compiler& c = compiler_;
|
X86Compiler& c = compiler_;
|
||||||
|
|
||||||
|
@ -1505,6 +1465,69 @@ void X64Emitter::clear_all_constant_gpr_values() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool X64Emitter::check_constant_gpr_read(uint32_t addr, GpVar* reg) {
|
||||||
|
X86Compiler& c = compiler_;
|
||||||
|
|
||||||
|
for (std::vector<RegisterAccessCallbacks>::const_iterator it =
|
||||||
|
access_callbacks_.begin(); it != access_callbacks_.end(); ++it) {
|
||||||
|
if (!it->handles(it->context, addr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
GpVar this_imm(c.newGpVar());
|
||||||
|
c.mov(this_imm, imm((uint64_t)it->context));
|
||||||
|
GpVar reg_imm(c.newGpVar());
|
||||||
|
c.mov(reg_imm, imm(addr));
|
||||||
|
|
||||||
|
X86CompilerFuncCall* call = c.call(it->read);
|
||||||
|
call->setPrototype(
|
||||||
|
kX86FuncConvDefault,
|
||||||
|
FuncBuilder2<uint64_t, void*, uint32_t>());
|
||||||
|
call->setArgument(0, this_imm);
|
||||||
|
call->setArgument(1, reg_imm);
|
||||||
|
GpVar res(c.newGpVar());
|
||||||
|
call->setReturn(res);
|
||||||
|
*reg = res;
|
||||||
|
|
||||||
|
// Don't let the caller handle the write.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool X64Emitter::check_constant_gpr_write(uint32_t addr, GpVar& reg) {
|
||||||
|
X86Compiler& c = compiler_;
|
||||||
|
|
||||||
|
for (std::vector<RegisterAccessCallbacks>::const_iterator it =
|
||||||
|
access_callbacks_.begin(); it != access_callbacks_.end(); ++it) {
|
||||||
|
if (!it->handles(it->context, addr)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
GpVar this_imm(c.newGpVar());
|
||||||
|
c.alloc(this_imm, rcx);
|
||||||
|
c.mov(this_imm, imm((uint64_t)it->context));
|
||||||
|
GpVar reg_imm(c.newGpVar());
|
||||||
|
c.alloc(reg_imm, rdx);
|
||||||
|
c.mov(reg_imm, imm(addr));
|
||||||
|
c.alloc(reg, r8);
|
||||||
|
|
||||||
|
X86CompilerFuncCall* call = c.call(it->write);
|
||||||
|
call->setPrototype(
|
||||||
|
kX86FuncConvDefault,
|
||||||
|
FuncBuilder3<void, void*, uint32_t, uint64_t>());
|
||||||
|
call->setArgument(0, this_imm);
|
||||||
|
call->setArgument(1, reg_imm);
|
||||||
|
call->setArgument(2, reg);
|
||||||
|
|
||||||
|
// Don't let the caller handle the write.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
GpVar X64Emitter::xer_value() {
|
GpVar X64Emitter::xer_value() {
|
||||||
X86Compiler& c = compiler_;
|
X86Compiler& c = compiler_;
|
||||||
if (FLAGS_cache_registers) {
|
if (FLAGS_cache_registers) {
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
#define XENIA_CPU_X64_X64_EMITTER_H_
|
#define XENIA_CPU_X64_X64_EMITTER_H_
|
||||||
|
|
||||||
#include <xenia/cpu/global_exports.h>
|
#include <xenia/cpu/global_exports.h>
|
||||||
|
#include <xenia/cpu/ppc.h>
|
||||||
#include <xenia/cpu/sdb.h>
|
#include <xenia/cpu/sdb.h>
|
||||||
#include <xenia/cpu/ppc/instr.h>
|
|
||||||
|
|
||||||
#include <asmjit/asmjit.h>
|
#include <asmjit/asmjit.h>
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ public:
|
||||||
X64Emitter(xe_memory_ref memory);
|
X64Emitter(xe_memory_ref memory);
|
||||||
~X64Emitter();
|
~X64Emitter();
|
||||||
|
|
||||||
void SetupGpuPointers(void* gpu_this, void* gpu_read, void* gpu_write);
|
void AddRegisterAccessCallbacks(ppc::RegisterAccessCallbacks callbacks);
|
||||||
|
|
||||||
void Lock();
|
void Lock();
|
||||||
void Unlock();
|
void Unlock();
|
||||||
|
@ -75,6 +75,9 @@ public:
|
||||||
void clear_constant_gpr_value(uint32_t n);
|
void clear_constant_gpr_value(uint32_t n);
|
||||||
void clear_all_constant_gpr_values();
|
void clear_all_constant_gpr_values();
|
||||||
|
|
||||||
|
bool check_constant_gpr_read(uint32_t addr, AsmJit::GpVar* reg);
|
||||||
|
bool check_constant_gpr_write(uint32_t addr, AsmJit::GpVar& reg);
|
||||||
|
|
||||||
AsmJit::GpVar xer_value();
|
AsmJit::GpVar xer_value();
|
||||||
void update_xer_value(AsmJit::GpVar& value);
|
void update_xer_value(AsmJit::GpVar& value);
|
||||||
void update_xer_with_overflow(AsmJit::GpVar& value);
|
void update_xer_with_overflow(AsmJit::GpVar& value);
|
||||||
|
@ -139,9 +142,7 @@ private:
|
||||||
xe_mutex_t* lock_;
|
xe_mutex_t* lock_;
|
||||||
uint32_t cpu_feature_mask_;
|
uint32_t cpu_feature_mask_;
|
||||||
|
|
||||||
void* gpu_this_;
|
std::vector<ppc::RegisterAccessCallbacks> access_callbacks_;
|
||||||
void* gpu_read_;
|
|
||||||
void* gpu_write_;
|
|
||||||
|
|
||||||
static uint64_t reserved_addr_;
|
static uint64_t reserved_addr_;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::cpu;
|
using namespace xe::cpu;
|
||||||
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::cpu::sdb;
|
using namespace xe::cpu::sdb;
|
||||||
using namespace xe::cpu::x64;
|
using namespace xe::cpu::x64;
|
||||||
|
|
||||||
|
@ -53,9 +54,8 @@ XECLEANUP:
|
||||||
return result_code;
|
return result_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void X64JIT::SetupGpuPointers(void* gpu_this,
|
void X64JIT::AddRegisterAccessCallbacks(RegisterAccessCallbacks callbacks) {
|
||||||
void* gpu_read, void* gpu_write) {
|
emitter_->AddRegisterAccessCallbacks(callbacks);
|
||||||
emitter_->SetupGpuPointers(gpu_this, gpu_read, gpu_write);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -29,8 +29,8 @@ public:
|
||||||
virtual ~X64JIT();
|
virtual ~X64JIT();
|
||||||
|
|
||||||
virtual int Setup();
|
virtual int Setup();
|
||||||
virtual void SetupGpuPointers(void* gpu_this,
|
virtual void AddRegisterAccessCallbacks(
|
||||||
void* gpu_read, void* gpu_write);
|
ppc::RegisterAccessCallbacks callbacks);
|
||||||
|
|
||||||
virtual int InitModule(ExecModule* module);
|
virtual int InitModule(ExecModule* module);
|
||||||
virtual int UninitModule(ExecModule* module);
|
virtual int UninitModule(ExecModule* module);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <gflags/gflags.h>
|
#include <gflags/gflags.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
#include <xenia/dbg/content_source.h>
|
#include <xenia/dbg/content_source.h>
|
||||||
#include <xenia/dbg/listener.h>
|
#include <xenia/dbg/listener.h>
|
||||||
|
|
||||||
|
@ -25,7 +26,8 @@ DEFINE_int32(remote_debug_port, 6200,
|
||||||
"Websocket port to listen for debugger connections on.");
|
"Websocket port to listen for debugger connections on.");
|
||||||
|
|
||||||
|
|
||||||
Debugger::Debugger() {
|
Debugger::Debugger(Emulator* emulator) :
|
||||||
|
emulator_(emulator) {
|
||||||
//listener_ = auto_ptr<Listener>(new WsListener(this, FLAGS_remote_debug_port));
|
//listener_ = auto_ptr<Listener>(new WsListener(this, FLAGS_remote_debug_port));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace dbg {
|
namespace dbg {
|
||||||
|
|
||||||
|
@ -28,7 +31,7 @@ class Listener;
|
||||||
|
|
||||||
class Debugger {
|
class Debugger {
|
||||||
public:
|
public:
|
||||||
Debugger();
|
Debugger(Emulator* emulator);
|
||||||
virtual ~Debugger();
|
virtual ~Debugger();
|
||||||
|
|
||||||
void RegisterContentSource(ContentSource* content_source);
|
void RegisterContentSource(ContentSource* content_source);
|
||||||
|
@ -45,6 +48,7 @@ private:
|
||||||
friend class Client;
|
friend class Client;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Emulator* emulator_;
|
||||||
auto_ptr<Listener> listener_;
|
auto_ptr<Listener> listener_;
|
||||||
std::vector<Client*> clients_;
|
std::vector<Client*> clients_;
|
||||||
std::map<uint32_t, ContentSource*> content_sources_;
|
std::map<uint32_t, ContentSource*> content_sources_;
|
||||||
|
|
|
@ -0,0 +1,196 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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. *
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
|
|
||||||
|
#include <xenia/apu/apu.h>
|
||||||
|
#include <xenia/cpu/cpu.h>
|
||||||
|
#include <xenia/dbg/debugger.h>
|
||||||
|
#include <xenia/gpu/gpu.h>
|
||||||
|
#include <xenia/kernel/kernel.h>
|
||||||
|
#include <xenia/kernel/modules.h>
|
||||||
|
#include <xenia/kernel/xboxkrnl/fs/filesystem.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace xe;
|
||||||
|
using namespace xe::apu;
|
||||||
|
using namespace xe::cpu;
|
||||||
|
using namespace xe::dbg;
|
||||||
|
using namespace xe::gpu;
|
||||||
|
using namespace xe::kernel;
|
||||||
|
using namespace xe::kernel::xam;
|
||||||
|
using namespace xe::kernel::xboxkrnl;
|
||||||
|
using namespace xe::kernel::xboxkrnl::fs;
|
||||||
|
|
||||||
|
|
||||||
|
Emulator::Emulator(const xechar_t* command_line) :
|
||||||
|
memory_(0),
|
||||||
|
debugger_(0),
|
||||||
|
cpu_backend_(0), processor_(0), audio_system_(0), graphics_system_(0),
|
||||||
|
export_resolver_(0), file_system_(0),
|
||||||
|
xboxkrnl_(0), xam_(0) {
|
||||||
|
XEIGNORE(xestrcpy(command_line_, XECOUNT(command_line_), command_line));
|
||||||
|
}
|
||||||
|
|
||||||
|
Emulator::~Emulator() {
|
||||||
|
// Note that we delete things in the reverse order they were initialized.
|
||||||
|
|
||||||
|
delete xam_;
|
||||||
|
delete xboxkrnl_;
|
||||||
|
|
||||||
|
delete file_system_;
|
||||||
|
|
||||||
|
delete graphics_system_;
|
||||||
|
delete audio_system_;
|
||||||
|
delete processor_;
|
||||||
|
delete cpu_backend_;
|
||||||
|
|
||||||
|
delete debugger_;
|
||||||
|
|
||||||
|
delete export_resolver_;
|
||||||
|
|
||||||
|
xe_memory_release(memory_);
|
||||||
|
}
|
||||||
|
|
||||||
|
X_STATUS Emulator::Setup() {
|
||||||
|
X_STATUS result = X_STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
// Create memory system first, as it is required for other systems.
|
||||||
|
xe_memory_options_t memory_options;
|
||||||
|
xe_zero_struct(&memory_options, sizeof(memory_options));
|
||||||
|
memory_ = xe_memory_create(memory_options);
|
||||||
|
XEEXPECTNOTNULL(memory_);
|
||||||
|
|
||||||
|
// Shared export resolver used to attach and query for HLE exports.
|
||||||
|
export_resolver_ = new ExportResolver();
|
||||||
|
XEEXPECTNOTNULL(export_resolver_);
|
||||||
|
|
||||||
|
// Create the debugger.
|
||||||
|
debugger_ = new Debugger(this);
|
||||||
|
XEEXPECTNOTNULL(debugger_);
|
||||||
|
|
||||||
|
// Initialize the CPU.
|
||||||
|
cpu_backend_ = new xe::cpu::x64::X64Backend();
|
||||||
|
XEEXPECTNOTNULL(cpu_backend_);
|
||||||
|
processor_ = new Processor(this, cpu_backend_);
|
||||||
|
XEEXPECTNOTNULL(processor_);
|
||||||
|
|
||||||
|
// Initialize the APU.
|
||||||
|
audio_system_ = xe::apu::Create(this);
|
||||||
|
XEEXPECTNOTNULL(audio_system_);
|
||||||
|
|
||||||
|
// Initialize the GPU.
|
||||||
|
graphics_system_ = xe::gpu::Create(this);
|
||||||
|
XEEXPECTNOTNULL(graphics_system_);
|
||||||
|
|
||||||
|
// Setup the core components.
|
||||||
|
result = processor_->Setup();
|
||||||
|
XEEXPECTZERO(result);
|
||||||
|
result = audio_system_->Setup();
|
||||||
|
XEEXPECTZERO(result);
|
||||||
|
result = graphics_system_->Setup();
|
||||||
|
XEEXPECTZERO(result);
|
||||||
|
|
||||||
|
// Bring up the virtual filesystem used by the kernel.
|
||||||
|
file_system_ = new FileSystem();
|
||||||
|
XEEXPECTNOTNULL(file_system_);
|
||||||
|
|
||||||
|
// HLE kernel modules.
|
||||||
|
xboxkrnl_ = new XboxkrnlModule(this);
|
||||||
|
XEEXPECTNOTNULL(xboxkrnl_);
|
||||||
|
xam_ = new XamModule(this);
|
||||||
|
XEEXPECTNOTNULL(xam_);
|
||||||
|
|
||||||
|
// Prepare the debugger.
|
||||||
|
// This may pause waiting for connections.
|
||||||
|
result = debugger_->Startup();
|
||||||
|
XEEXPECTZERO(result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
|
||||||
|
XECLEANUP:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
X_STATUS Emulator::LaunchXexFile(const xechar_t* path) {
|
||||||
|
// We create a virtual filesystem pointing to its directory and symlink
|
||||||
|
// that to the game filesystem.
|
||||||
|
// e.g., /my/files/foo.xex will get a local fs at:
|
||||||
|
// \\Device\\Harddisk0\\Partition1
|
||||||
|
// and then get that symlinked to game:\, so
|
||||||
|
// -> game:\foo.xex
|
||||||
|
|
||||||
|
int result_code = 0;
|
||||||
|
|
||||||
|
// Get just the filename (foo.xex).
|
||||||
|
const xechar_t* file_name = xestrrchr(path, XE_PATH_SEPARATOR);
|
||||||
|
if (file_name) {
|
||||||
|
// Skip slash.
|
||||||
|
file_name++;
|
||||||
|
} else {
|
||||||
|
// No slash found, whole thing is a file.
|
||||||
|
file_name = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the parent path of the file.
|
||||||
|
xechar_t parent_path[XE_MAX_PATH];
|
||||||
|
XEIGNORE(xestrcpy(parent_path, XECOUNT(parent_path), path));
|
||||||
|
parent_path[file_name - path] = 0;
|
||||||
|
|
||||||
|
// Register the local directory in the virtual filesystem.
|
||||||
|
result_code = file_system_->RegisterHostPathDevice(
|
||||||
|
"\\Device\\Harddisk1\\Partition0", parent_path);
|
||||||
|
if (result_code) {
|
||||||
|
XELOGE("Unable to mount local directory");
|
||||||
|
return result_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create symlinks to the device.
|
||||||
|
file_system_->CreateSymbolicLink(
|
||||||
|
"game:", "\\Device\\Harddisk1\\Partition0");
|
||||||
|
file_system_->CreateSymbolicLink(
|
||||||
|
"d:", "\\Device\\Harddisk1\\Partition0");
|
||||||
|
|
||||||
|
// Get the file name of the module to load from the filesystem.
|
||||||
|
char fs_path[XE_MAX_PATH];
|
||||||
|
XEIGNORE(xestrcpya(fs_path, XECOUNT(fs_path), "game:\\"));
|
||||||
|
char* fs_path_ptr = fs_path + xestrlena(fs_path);
|
||||||
|
*fs_path_ptr = 0;
|
||||||
|
#if XE_WCHAR
|
||||||
|
XEIGNORE(xestrnarrow(fs_path_ptr, XECOUNT(fs_path), file_name));
|
||||||
|
#else
|
||||||
|
XEIGNORE(xestrcpya(fs_path_ptr, XECOUNT(fs_path), file_name));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Launch the game.
|
||||||
|
return xboxkrnl_->LaunchModule(fs_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
X_STATUS Emulator::LaunchDiscImage(const xechar_t* path) {
|
||||||
|
int result_code = 0;
|
||||||
|
|
||||||
|
// Register the disc image in the virtual filesystem.
|
||||||
|
result_code = file_system_->RegisterDiscImageDevice(
|
||||||
|
"\\Device\\Cdrom0", path);
|
||||||
|
if (result_code) {
|
||||||
|
XELOGE("Unable to mount disc image");
|
||||||
|
return result_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create symlinks to the device.
|
||||||
|
file_system_->CreateSymbolicLink(
|
||||||
|
"game:",
|
||||||
|
"\\Device\\Cdrom0");
|
||||||
|
file_system_->CreateSymbolicLink(
|
||||||
|
"d:",
|
||||||
|
"\\Device\\Cdrom0");
|
||||||
|
|
||||||
|
// Launch the game.
|
||||||
|
return xboxkrnl_->LaunchModule("game:\\default.xex");
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_EMULATOR_H_
|
||||||
|
#define XENIA_EMULATOR_H_
|
||||||
|
|
||||||
|
#include <xenia/common.h>
|
||||||
|
#include <xenia/core.h>
|
||||||
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, ExportResolver);
|
||||||
|
XEDECLARECLASS2(xe, apu, AudioSystem);
|
||||||
|
XEDECLARECLASS2(xe, cpu, Backend);
|
||||||
|
XEDECLARECLASS2(xe, cpu, Processor);
|
||||||
|
XEDECLARECLASS2(xe, dbg, Debugger);
|
||||||
|
XEDECLARECLASS2(xe, gpu, GraphicsSystem);
|
||||||
|
XEDECLARECLASS3(xe, kernel, xam, XamModule);
|
||||||
|
XEDECLARECLASS3(xe, kernel, xboxkrnl, XboxkrnlModule);
|
||||||
|
XEDECLARECLASS4(xe, kernel, xboxkrnl, fs, FileSystem);
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
|
||||||
|
|
||||||
|
class Emulator {
|
||||||
|
public:
|
||||||
|
Emulator(const xechar_t* command_line);
|
||||||
|
~Emulator();
|
||||||
|
|
||||||
|
const xechar_t* command_line() const { return command_line_; }
|
||||||
|
xe_memory_ref memory() const { return memory_; }
|
||||||
|
|
||||||
|
dbg::Debugger* debugger() const { return debugger_; }
|
||||||
|
|
||||||
|
cpu::Processor* processor() const { return processor_; }
|
||||||
|
apu::AudioSystem* audio_system() const { return audio_system_; }
|
||||||
|
gpu::GraphicsSystem* graphics_system() const { return graphics_system_; }
|
||||||
|
|
||||||
|
ExportResolver* export_resolver() const { return export_resolver_; }
|
||||||
|
kernel::xboxkrnl::fs::FileSystem* file_system() const { return file_system_; }
|
||||||
|
|
||||||
|
X_STATUS Setup();
|
||||||
|
|
||||||
|
// TODO(benvanik): raw binary.
|
||||||
|
X_STATUS LaunchXexFile(const xechar_t* path);
|
||||||
|
X_STATUS LaunchDiscImage(const xechar_t* path);
|
||||||
|
|
||||||
|
private:
|
||||||
|
xechar_t command_line_[XE_MAX_PATH];
|
||||||
|
xe_memory_ref memory_;
|
||||||
|
|
||||||
|
dbg::Debugger* debugger_;
|
||||||
|
|
||||||
|
cpu::Backend* cpu_backend_;
|
||||||
|
cpu::Processor* processor_;
|
||||||
|
apu::AudioSystem* audio_system_;
|
||||||
|
gpu::GraphicsSystem* graphics_system_;
|
||||||
|
|
||||||
|
ExportResolver* export_resolver_;
|
||||||
|
kernel::xboxkrnl::fs::FileSystem* file_system_;
|
||||||
|
|
||||||
|
kernel::xboxkrnl::XboxkrnlModule* xboxkrnl_;
|
||||||
|
kernel::xam::XamModule* xam_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_EMULATOR_H_
|
|
@ -7,11 +7,10 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::kernel;
|
|
||||||
|
|
||||||
|
|
||||||
ExportResolver::ExportResolver() {
|
ExportResolver::ExportResolver() {
|
|
@ -7,8 +7,8 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_EXPORT_H_
|
#ifndef XENIA_EXPORT_RESOLVER_H_
|
||||||
#define XENIA_KERNEL_EXPORT_H_
|
#define XENIA_EXPORT_RESOLVER_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ typedef struct xe_ppc_state xe_ppc_state_t;
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace kernel {
|
|
||||||
|
|
||||||
|
|
||||||
typedef void (*xe_kernel_export_impl_fn)();
|
typedef void (*xe_kernel_export_impl_fn)();
|
||||||
|
@ -92,8 +91,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace kernel
|
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_EXPORT_H_
|
#endif // XENIA_EXPORT_RESOLVER_H_
|
|
@ -1,31 +1,31 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_GPU_D3D11_D3D11_PRIVATE_H_
|
#ifndef XENIA_GPU_D3D11_D3D11_GPU_PRIVATE_H_
|
||||||
#define XENIA_GPU_D3D11_D3D11_PRIVATE_H_
|
#define XENIA_GPU_D3D11_D3D11_GPU_PRIVATE_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/d3d11/d3d11.h>
|
#include <xenia/gpu/d3d11/d3d11_gpu.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace gpu {
|
namespace gpu {
|
||||||
namespace d3d11 {
|
namespace d3d11 {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace d3d11
|
} // namespace d3d11
|
||||||
} // namespace gpu
|
} // namespace gpu
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_GPU_D3D11_D3D11_PRIVATE_H_
|
#endif // XENIA_GPU_D3D11_D3D11_GPU_PRIVATE_H_
|
|
@ -1,44 +1,44 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/gpu/d3d11/d3d11.h>
|
#include <xenia/gpu/d3d11/d3d11_gpu.h>
|
||||||
|
|
||||||
#include <xenia/gpu/d3d11/d3d11_graphics_system.h>
|
#include <xenia/gpu/d3d11/d3d11_graphics_system.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::gpu;
|
using namespace xe::gpu;
|
||||||
using namespace xe::gpu::d3d11;
|
using namespace xe::gpu::d3d11;
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void InitializeIfNeeded();
|
void InitializeIfNeeded();
|
||||||
void CleanupOnShutdown();
|
void CleanupOnShutdown();
|
||||||
|
|
||||||
void InitializeIfNeeded() {
|
void InitializeIfNeeded() {
|
||||||
static bool has_initialized = false;
|
static bool has_initialized = false;
|
||||||
if (has_initialized) {
|
if (has_initialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
has_initialized = true;
|
has_initialized = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
atexit(CleanupOnShutdown);
|
atexit(CleanupOnShutdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanupOnShutdown() {
|
void CleanupOnShutdown() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* xe::gpu::d3d11::Create(const CreationParams* params) {
|
GraphicsSystem* xe::gpu::d3d11::Create(Emulator* emulator) {
|
||||||
InitializeIfNeeded();
|
InitializeIfNeeded();
|
||||||
return new D3D11GraphicsSystem(params);
|
return new D3D11GraphicsSystem(emulator);
|
||||||
}
|
}
|
|
@ -1,33 +1,33 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_GPU_D3D11_D3D11_H_
|
#ifndef XENIA_GPU_D3D11_D3D11_GPU_H_
|
||||||
#define XENIA_GPU_D3D11_D3D11_H_
|
#define XENIA_GPU_D3D11_D3D11_GPU_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
namespace gpu {
|
XEDECLARECLASS2(xe, gpu, GraphicsSystem);
|
||||||
|
|
||||||
class CreationParams;
|
|
||||||
class GraphicsSystem;
|
namespace xe {
|
||||||
|
namespace gpu {
|
||||||
namespace d3d11 {
|
namespace d3d11 {
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* Create(const CreationParams* params);
|
GraphicsSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
|
|
||||||
} // namespace d3d11
|
} // namespace d3d11
|
||||||
} // namespace gpu
|
} // namespace gpu
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_GPU_D3D11_D3D11_H_
|
#endif // XENIA_GPU_D3D11_D3D11_GPU_H_
|
|
@ -13,7 +13,7 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/graphics_driver.h>
|
#include <xenia/gpu/graphics_driver.h>
|
||||||
#include <xenia/gpu/d3d11/d3d11-private.h>
|
#include <xenia/gpu/d3d11/d3d11_gpu-private.h>
|
||||||
#include <xenia/gpu/xenos/xenos.h>
|
#include <xenia/gpu/xenos/xenos.h>
|
||||||
|
|
||||||
#include <d3d11.h>
|
#include <d3d11.h>
|
||||||
|
|
|
@ -21,7 +21,8 @@ using namespace xe::gpu::d3d11;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void __stdcall D3D11GraphicsSystemVsyncCallback(D3D11GraphicsSystem* gs, BOOLEAN) {
|
void __stdcall D3D11GraphicsSystemVsyncCallback(
|
||||||
|
D3D11GraphicsSystem* gs, BOOLEAN) {
|
||||||
gs->MarkVblank();
|
gs->MarkVblank();
|
||||||
gs->DispatchInterruptCallback(0);
|
gs->DispatchInterruptCallback(0);
|
||||||
}
|
}
|
||||||
|
@ -29,10 +30,10 @@ void __stdcall D3D11GraphicsSystemVsyncCallback(D3D11GraphicsSystem* gs, BOOLEAN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
D3D11GraphicsSystem::D3D11GraphicsSystem(const CreationParams* params) :
|
D3D11GraphicsSystem::D3D11GraphicsSystem(Emulator* emulator) :
|
||||||
window_(0), dxgi_factory_(0), device_(0),
|
window_(0), dxgi_factory_(0), device_(0),
|
||||||
timer_queue_(NULL), vsync_timer_(NULL),
|
timer_queue_(NULL), vsync_timer_(NULL),
|
||||||
GraphicsSystem(params) {
|
GraphicsSystem(emulator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
D3D11GraphicsSystem::~D3D11GraphicsSystem() {
|
D3D11GraphicsSystem::~D3D11GraphicsSystem() {
|
||||||
|
@ -78,7 +79,7 @@ void D3D11GraphicsSystem::Initialize() {
|
||||||
}
|
}
|
||||||
// Just go with the default for now.
|
// Just go with the default for now.
|
||||||
adapter = 0;
|
adapter = 0;
|
||||||
|
|
||||||
D3D_DRIVER_TYPE driver_type =
|
D3D_DRIVER_TYPE driver_type =
|
||||||
adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE;
|
adapter ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE;
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/graphics_system.h>
|
#include <xenia/gpu/graphics_system.h>
|
||||||
#include <xenia/gpu/d3d11/d3d11-private.h>
|
#include <xenia/gpu/d3d11/d3d11_gpu-private.h>
|
||||||
|
|
||||||
#include <d3d11.h>
|
#include <d3d11.h>
|
||||||
|
|
||||||
|
@ -25,12 +25,12 @@ namespace d3d11 {
|
||||||
class D3D11Window;
|
class D3D11Window;
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* Create(const CreationParams* params);
|
GraphicsSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
|
|
||||||
class D3D11GraphicsSystem : public GraphicsSystem {
|
class D3D11GraphicsSystem : public GraphicsSystem {
|
||||||
public:
|
public:
|
||||||
D3D11GraphicsSystem(const CreationParams* params);
|
D3D11GraphicsSystem(Emulator* emulator);
|
||||||
virtual ~D3D11GraphicsSystem();
|
virtual ~D3D11GraphicsSystem();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||||
{
|
{
|
||||||
'sources': [
|
'sources': [
|
||||||
'd3d11-private.h',
|
'd3d11_gpu-private.h',
|
||||||
'd3d11.cc',
|
'd3d11_gpu.cc',
|
||||||
'd3d11.h',
|
'd3d11_gpu.h',
|
||||||
'd3d11_graphics_driver.cc',
|
'd3d11_graphics_driver.cc',
|
||||||
'd3d11_graphics_driver.h',
|
'd3d11_graphics_driver.h',
|
||||||
'd3d11_graphics_system.cc',
|
'd3d11_graphics_system.cc',
|
||||||
|
|
|
@ -20,39 +20,39 @@ DEFINE_string(gpu, "any",
|
||||||
"Graphics system. Use: [any, nop, d3d11]");
|
"Graphics system. Use: [any, nop, d3d11]");
|
||||||
|
|
||||||
|
|
||||||
#include <xenia/gpu/nop/nop.h>
|
#include <xenia/gpu/nop/nop_gpu.h>
|
||||||
GraphicsSystem* xe::gpu::CreateNop(const CreationParams* params) {
|
GraphicsSystem* xe::gpu::CreateNop(Emulator* emulator) {
|
||||||
return xe::gpu::nop::Create(params);
|
return xe::gpu::nop::Create(emulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if XE_PLATFORM(WIN32)
|
#if XE_PLATFORM(WIN32)
|
||||||
#include <xenia/gpu/d3d11/d3d11.h>
|
#include <xenia/gpu/d3d11/d3d11_gpu.h>
|
||||||
GraphicsSystem* xe::gpu::CreateD3D11(const CreationParams* params) {
|
GraphicsSystem* xe::gpu::CreateD3D11(Emulator* emulator) {
|
||||||
return xe::gpu::d3d11::Create(params);
|
return xe::gpu::d3d11::Create(emulator);
|
||||||
}
|
}
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* xe::gpu::Create(const CreationParams* params) {
|
GraphicsSystem* xe::gpu::Create(Emulator* emulator) {
|
||||||
if (FLAGS_gpu.compare("nop") == 0) {
|
if (FLAGS_gpu.compare("nop") == 0) {
|
||||||
return CreateNop(params);
|
return CreateNop(emulator);
|
||||||
#if XE_PLATFORM(WIN32)
|
#if XE_PLATFORM(WIN32)
|
||||||
} else if (FLAGS_gpu.compare("d3d11") == 0) {
|
} else if (FLAGS_gpu.compare("d3d11") == 0) {
|
||||||
return CreateD3D11(params);
|
return CreateD3D11(emulator);
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
} else {
|
} else {
|
||||||
// Create best available.
|
// Create best available.
|
||||||
GraphicsSystem* best = NULL;
|
GraphicsSystem* best = NULL;
|
||||||
|
|
||||||
#if XE_PLATFORM(WIN32)
|
#if XE_PLATFORM(WIN32)
|
||||||
best = CreateD3D11(params);
|
best = CreateD3D11(emulator);
|
||||||
if (best) {
|
if (best) {
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
// Fallback to nop.
|
// Fallback to nop.
|
||||||
return CreateNop(params);
|
return CreateNop(emulator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,16 +13,19 @@
|
||||||
#include <xenia/gpu/graphics_system.h>
|
#include <xenia/gpu/graphics_system.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace gpu {
|
namespace gpu {
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* Create(const CreationParams* params);
|
GraphicsSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
GraphicsSystem* CreateNop(const CreationParams* params);
|
GraphicsSystem* CreateNop(Emulator* emulator);
|
||||||
|
|
||||||
#if XE_PLATFORM(WIN32)
|
#if XE_PLATFORM(WIN32)
|
||||||
GraphicsSystem* CreateD3D11(const CreationParams* params);
|
GraphicsSystem* CreateD3D11(Emulator* emulator);
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,3 @@ GraphicsDriver::GraphicsDriver(xe_memory_ref memory) :
|
||||||
GraphicsDriver::~GraphicsDriver() {
|
GraphicsDriver::~GraphicsDriver() {
|
||||||
xe_memory_release(memory_);
|
xe_memory_release(memory_);
|
||||||
}
|
}
|
||||||
|
|
||||||
xe_memory_ref GraphicsDriver::memory() {
|
|
||||||
return xe_memory_retain(memory_);
|
|
||||||
}
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ class GraphicsDriver {
|
||||||
public:
|
public:
|
||||||
virtual ~GraphicsDriver();
|
virtual ~GraphicsDriver();
|
||||||
|
|
||||||
xe_memory_ref memory();
|
xe_memory_ref memory() const { return memory_; }
|
||||||
xenos::RegisterFile* register_file() { return ®ister_file_; };
|
xenos::RegisterFile* register_file() { return ®ister_file_; };
|
||||||
void set_address_translation(uint32_t value) {
|
void set_address_translation(uint32_t value) {
|
||||||
address_translation_ = value;
|
address_translation_ = value;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <xenia/gpu/graphics_system.h>
|
#include <xenia/gpu/graphics_system.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
#include <xenia/cpu/processor.h>
|
#include <xenia/cpu/processor.h>
|
||||||
#include <xenia/gpu/graphics_driver.h>
|
#include <xenia/gpu/graphics_driver.h>
|
||||||
#include <xenia/gpu/ring_buffer_worker.h>
|
#include <xenia/gpu/ring_buffer_worker.h>
|
||||||
|
@ -16,33 +17,21 @@
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
|
using namespace xe::cpu::ppc;
|
||||||
using namespace xe::gpu;
|
using namespace xe::gpu;
|
||||||
using namespace xe::gpu::xenos;
|
using namespace xe::gpu::xenos;
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem::GraphicsSystem(const CreationParams* params) :
|
GraphicsSystem::GraphicsSystem(Emulator* emulator) :
|
||||||
|
emulator_(emulator),
|
||||||
|
thread_(0), running_(false), driver_(0), worker_(0),
|
||||||
interrupt_callback_(0), interrupt_callback_data_(0),
|
interrupt_callback_(0), interrupt_callback_data_(0),
|
||||||
last_interrupt_time_(0), swap_pending_(false) {
|
last_interrupt_time_(0), swap_pending_(false) {
|
||||||
memory_ = xe_memory_retain(params->memory);
|
memory_ = xe_memory_retain(emulator->memory());
|
||||||
|
|
||||||
worker_ = new RingBufferWorker(this, memory_);
|
|
||||||
|
|
||||||
// Set during Initialize();
|
|
||||||
driver_ = 0;
|
|
||||||
|
|
||||||
// Create the run loop used for any windows/etc.
|
// Create the run loop used for any windows/etc.
|
||||||
// This must be done on the thread we create the driver.
|
// This must be done on the thread we create the driver.
|
||||||
run_loop_ = xe_run_loop_create();
|
run_loop_ = xe_run_loop_create();
|
||||||
|
|
||||||
// Create worker thread.
|
|
||||||
// This will initialize the graphics system.
|
|
||||||
// Init needs to happen there so that any thread-local stuff
|
|
||||||
// is created on the right thread.
|
|
||||||
running_ = true;
|
|
||||||
thread_ = xe_thread_create(
|
|
||||||
"GraphicsSystem",
|
|
||||||
(xe_thread_callback)ThreadStartThunk, this);
|
|
||||||
xe_thread_start(thread_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsSystem::~GraphicsSystem() {
|
GraphicsSystem::~GraphicsSystem() {
|
||||||
|
@ -57,16 +46,31 @@ GraphicsSystem::~GraphicsSystem() {
|
||||||
xe_memory_release(memory_);
|
xe_memory_release(memory_);
|
||||||
}
|
}
|
||||||
|
|
||||||
xe_memory_ref GraphicsSystem::memory() {
|
X_STATUS GraphicsSystem::Setup() {
|
||||||
return xe_memory_retain(memory_);
|
processor_ = emulator_->processor();
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<cpu::Processor> GraphicsSystem::processor() {
|
// Create worker.
|
||||||
return processor_;
|
worker_ = new RingBufferWorker(this, memory_);
|
||||||
}
|
|
||||||
|
|
||||||
void GraphicsSystem::set_processor(shared_ptr<cpu::Processor> processor) {
|
// Let the processor know we want register access callbacks.
|
||||||
processor_ = processor;
|
RegisterAccessCallbacks callbacks;
|
||||||
|
callbacks.context = this;
|
||||||
|
callbacks.handles = (RegisterHandlesCallback)HandlesRegisterThunk;
|
||||||
|
callbacks.read = (RegisterReadCallback)ReadRegisterThunk;
|
||||||
|
callbacks.write = (RegisterWriteCallback)WriteRegisterThunk;
|
||||||
|
emulator_->processor()->AddRegisterAccessCallbacks(callbacks);
|
||||||
|
|
||||||
|
// Create worker thread.
|
||||||
|
// This will initialize the graphics system.
|
||||||
|
// Init needs to happen there so that any thread-local stuff
|
||||||
|
// is created on the right thread.
|
||||||
|
running_ = true;
|
||||||
|
thread_ = xe_thread_create(
|
||||||
|
"GraphicsSystem",
|
||||||
|
(xe_thread_callback)ThreadStartThunk, this);
|
||||||
|
xe_thread_start(thread_);
|
||||||
|
|
||||||
|
return X_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsSystem::ThreadStart() {
|
void GraphicsSystem::ThreadStart() {
|
||||||
|
@ -128,7 +132,12 @@ void GraphicsSystem::EnableReadPointerWriteBack(uint32_t ptr,
|
||||||
worker_->EnableReadPointerWriteBack(ptr, block_size);
|
worker_->EnableReadPointerWriteBack(ptr, block_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t GraphicsSystem::ReadRegister(uint32_t r) {
|
bool GraphicsSystem::HandlesRegister(uint32_t addr) {
|
||||||
|
return (addr & 0xFFFF0000) == 0x7FC80000;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t GraphicsSystem::ReadRegister(uint32_t addr) {
|
||||||
|
uint32_t r = addr & 0xFFFF;
|
||||||
XELOGGPU("ReadRegister(%.4X)", r);
|
XELOGGPU("ReadRegister(%.4X)", r);
|
||||||
|
|
||||||
RegisterFile* regs = driver_->register_file();
|
RegisterFile* regs = driver_->register_file();
|
||||||
|
@ -142,7 +151,8 @@ uint64_t GraphicsSystem::ReadRegister(uint32_t r) {
|
||||||
return regs->values[r].u32;
|
return regs->values[r].u32;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsSystem::WriteRegister(uint32_t r, uint64_t value) {
|
void GraphicsSystem::WriteRegister(uint32_t addr, uint64_t value) {
|
||||||
|
uint32_t r = addr & 0xFFFF;
|
||||||
XELOGGPU("WriteRegister(%.4X, %.8X)", r, value);
|
XELOGGPU("WriteRegister(%.4X, %.8X)", r, value);
|
||||||
|
|
||||||
RegisterFile* regs = driver_->register_file();
|
RegisterFile* regs = driver_->register_file();
|
||||||
|
|
|
@ -11,13 +11,11 @@
|
||||||
#define XENIA_GPU_GRAPHICS_SYSTEM_H_
|
#define XENIA_GPU_GRAPHICS_SYSTEM_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
namespace cpu {
|
XEDECLARECLASS2(xe, cpu, Processor);
|
||||||
class Processor;
|
|
||||||
} // namespace cpu
|
|
||||||
} // namespace xe
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -27,47 +25,29 @@ class GraphicsDriver;
|
||||||
class RingBufferWorker;
|
class RingBufferWorker;
|
||||||
|
|
||||||
|
|
||||||
class CreationParams {
|
|
||||||
public:
|
|
||||||
xe_memory_ref memory;
|
|
||||||
|
|
||||||
CreationParams() :
|
|
||||||
memory(0) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class GraphicsSystem {
|
class GraphicsSystem {
|
||||||
public:
|
public:
|
||||||
virtual ~GraphicsSystem();
|
virtual ~GraphicsSystem();
|
||||||
|
|
||||||
xe_memory_ref memory();
|
Emulator* emulator() const { return emulator_; }
|
||||||
shared_ptr<cpu::Processor> processor();
|
xe_memory_ref memory() const { return memory_; }
|
||||||
void set_processor(shared_ptr<cpu::Processor> processor);
|
cpu::Processor* processor() const { return processor_; }
|
||||||
|
|
||||||
|
virtual X_STATUS Setup();
|
||||||
|
|
||||||
void SetInterruptCallback(uint32_t callback, uint32_t user_data);
|
void SetInterruptCallback(uint32_t callback, uint32_t user_data);
|
||||||
void InitializeRingBuffer(uint32_t ptr, uint32_t page_count);
|
void InitializeRingBuffer(uint32_t ptr, uint32_t page_count);
|
||||||
void EnableReadPointerWriteBack(uint32_t ptr, uint32_t block_size);
|
void EnableReadPointerWriteBack(uint32_t ptr, uint32_t block_size);
|
||||||
|
|
||||||
virtual uint64_t ReadRegister(uint32_t r);
|
bool HandlesRegister(uint32_t addr);
|
||||||
virtual void WriteRegister(uint32_t r, uint64_t value);
|
virtual uint64_t ReadRegister(uint32_t addr);
|
||||||
|
virtual void WriteRegister(uint32_t addr, uint64_t value);
|
||||||
|
|
||||||
void MarkVblank();
|
void MarkVblank();
|
||||||
void DispatchInterruptCallback(uint32_t source, uint32_t cpu = 0xFFFFFFFF);
|
void DispatchInterruptCallback(uint32_t source, uint32_t cpu = 0xFFFFFFFF);
|
||||||
bool swap_pending() const { return swap_pending_; }
|
bool swap_pending() const { return swap_pending_; }
|
||||||
void set_swap_pending(bool value) { swap_pending_ = value; }
|
void set_swap_pending(bool value) { swap_pending_ = value; }
|
||||||
|
|
||||||
public:
|
|
||||||
// TODO(benvanik): have an HasRegisterHandler() so that the JIT can
|
|
||||||
// just poke the register file directly.
|
|
||||||
static uint64_t ReadRegisterThunk(GraphicsSystem* this_ptr, uint32_t r) {
|
|
||||||
return this_ptr->ReadRegister(r);
|
|
||||||
}
|
|
||||||
static void WriteRegisterThunk(GraphicsSystem* this_ptr, uint32_t r,
|
|
||||||
uint64_t value) {
|
|
||||||
this_ptr->WriteRegister(r, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Initialize();
|
virtual void Initialize();
|
||||||
virtual void Pump() = 0;
|
virtual void Pump() = 0;
|
||||||
|
@ -79,12 +59,24 @@ private:
|
||||||
}
|
}
|
||||||
void ThreadStart();
|
void ThreadStart();
|
||||||
|
|
||||||
protected:
|
static bool HandlesRegisterThunk(GraphicsSystem* gs, uint32_t addr) {
|
||||||
GraphicsSystem(const CreationParams* params);
|
return gs->HandlesRegister(addr);
|
||||||
|
}
|
||||||
|
static uint64_t ReadRegisterThunk(GraphicsSystem* gs, uint32_t addr) {
|
||||||
|
return gs->ReadRegister(addr);
|
||||||
|
}
|
||||||
|
static void WriteRegisterThunk(GraphicsSystem* gs, uint32_t addr,
|
||||||
|
uint64_t value) {
|
||||||
|
gs->WriteRegister(addr, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
GraphicsSystem(Emulator* emulator);
|
||||||
|
|
||||||
|
Emulator* emulator_;
|
||||||
xe_memory_ref memory_;
|
xe_memory_ref memory_;
|
||||||
shared_ptr<cpu::Processor> processor_;
|
cpu::Processor* processor_;
|
||||||
|
|
||||||
xe_run_loop_ref run_loop_;
|
xe_run_loop_ref run_loop_;
|
||||||
xe_thread_ref thread_;
|
xe_thread_ref thread_;
|
||||||
bool running_;
|
bool running_;
|
||||||
|
|
|
@ -1,31 +1,31 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_GPU_NOP_NOP_PRIVATE_H_
|
#ifndef XENIA_GPU_NOP_NOP_GPU_PRIVATE_H_
|
||||||
#define XENIA_GPU_NOP_NOP_PRIVATE_H_
|
#define XENIA_GPU_NOP_NOP_GPU_PRIVATE_H_
|
||||||
|
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/nop/nop.h>
|
#include <xenia/gpu/nop/nop_gpu.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace gpu {
|
namespace gpu {
|
||||||
namespace nop {
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace nop
|
} // namespace nop
|
||||||
} // namespace gpu
|
} // namespace gpu
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_GPU_NOP_NOP_PRIVATE_H_
|
#endif // XENIA_GPU_NOP_NOP_PRIVATE_H_
|
|
@ -1,44 +1,44 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/gpu/nop/nop.h>
|
#include <xenia/gpu/nop/nop_gpu.h>
|
||||||
|
|
||||||
#include <xenia/gpu/nop/nop_graphics_system.h>
|
#include <xenia/gpu/nop/nop_graphics_system.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::gpu;
|
using namespace xe::gpu;
|
||||||
using namespace xe::gpu::nop;
|
using namespace xe::gpu::nop;
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void InitializeIfNeeded();
|
void InitializeIfNeeded();
|
||||||
void CleanupOnShutdown();
|
void CleanupOnShutdown();
|
||||||
|
|
||||||
void InitializeIfNeeded() {
|
void InitializeIfNeeded() {
|
||||||
static bool has_initialized = false;
|
static bool has_initialized = false;
|
||||||
if (has_initialized) {
|
if (has_initialized) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
has_initialized = true;
|
has_initialized = true;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
atexit(CleanupOnShutdown);
|
atexit(CleanupOnShutdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CleanupOnShutdown() {
|
void CleanupOnShutdown() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GraphicsSystem* xe::gpu::nop::Create(const CreationParams* params) {
|
GraphicsSystem* xe::gpu::nop::Create(Emulator* emulator) {
|
||||||
InitializeIfNeeded();
|
InitializeIfNeeded();
|
||||||
return new NopGraphicsSystem(params);
|
return new NopGraphicsSystem(emulator);
|
||||||
}
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* 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_GPU_NOP_NOP_GPU_H_
|
||||||
|
#define XENIA_GPU_NOP_NOP_GPU_H_
|
||||||
|
|
||||||
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
XEDECLARECLASS2(xe, gpu, GraphicsSystem);
|
||||||
|
|
||||||
|
|
||||||
|
namespace xe {
|
||||||
|
namespace gpu {
|
||||||
|
namespace nop {
|
||||||
|
|
||||||
|
|
||||||
|
GraphicsSystem* Create(Emulator* emulator);
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace nop
|
||||||
|
} // namespace gpu
|
||||||
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
#endif // XENIA_GPU_NOP_NOP_GPU_H_
|
|
@ -13,7 +13,7 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/graphics_driver.h>
|
#include <xenia/gpu/graphics_driver.h>
|
||||||
#include <xenia/gpu/nop/nop-private.h>
|
#include <xenia/gpu/nop/nop_gpu-private.h>
|
||||||
#include <xenia/gpu/xenos/xenos.h>
|
#include <xenia/gpu/xenos/xenos.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,8 @@ void __stdcall NopGraphicsSystemVsyncCallback(NopGraphicsSystem* gs, BOOLEAN) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NopGraphicsSystem::NopGraphicsSystem(const CreationParams* params) :
|
NopGraphicsSystem::NopGraphicsSystem(Emulator* emulator) :
|
||||||
GraphicsSystem(params),
|
GraphicsSystem(emulator),
|
||||||
timer_queue_(NULL),
|
timer_queue_(NULL),
|
||||||
vsync_timer_(NULL) {
|
vsync_timer_(NULL) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/gpu/graphics_system.h>
|
#include <xenia/gpu/graphics_system.h>
|
||||||
#include <xenia/gpu/nop/nop-private.h>
|
#include <xenia/gpu/nop/nop_gpu-private.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -23,7 +23,7 @@ namespace nop {
|
||||||
|
|
||||||
class NopGraphicsSystem : public GraphicsSystem {
|
class NopGraphicsSystem : public GraphicsSystem {
|
||||||
public:
|
public:
|
||||||
NopGraphicsSystem(const CreationParams* params);
|
NopGraphicsSystem(Emulator* emulator);
|
||||||
virtual ~NopGraphicsSystem();
|
virtual ~NopGraphicsSystem();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||||
{
|
{
|
||||||
'sources': [
|
'sources': [
|
||||||
'nop-private.h',
|
'nop_gpu-private.h',
|
||||||
'nop.cc',
|
'nop_gpu.cc',
|
||||||
'nop.h',
|
'nop_gpu.h',
|
||||||
'nop_graphics_driver.cc',
|
'nop_graphics_driver.cc',
|
||||||
'nop_graphics_driver.h',
|
'nop_graphics_driver.h',
|
||||||
'nop_graphics_system.cc',
|
'nop_graphics_system.cc',
|
||||||
|
|
|
@ -570,7 +570,7 @@ uint32_t RingBufferWorker::ExecutePacket(PacketArgs& args) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0x4: // REGISTER
|
case 0x4: // REGISTER
|
||||||
index += 0x2000;
|
index += 0x2000;
|
||||||
for (int n = 0; n < count - 1; n++, index++) {
|
for (uint32_t n = 0; n < count - 1; n++, index++) {
|
||||||
uint32_t data = READ_PTR();
|
uint32_t data = READ_PTR();
|
||||||
const char* reg_name = xenos::GetRegisterName(index);
|
const char* reg_name = xenos::GetRegisterName(index);
|
||||||
XELOGGPU("[%.8X] %.8X -> %.4X %s",
|
XELOGGPU("[%.8X] %.8X -> %.4X %s",
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
'register_table.inc',
|
'register_table.inc',
|
||||||
'registers.cc',
|
'registers.cc',
|
||||||
'registers.h',
|
'registers.h',
|
||||||
'ucode.cc',
|
|
||||||
'ucode.h',
|
'ucode.h',
|
||||||
'ucode_disassembler.cc',
|
'ucode_disassembler.cc',
|
||||||
'ucode_disassembler.h',
|
'ucode_disassembler.h',
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#ifndef XENIA_KERNEL_KERNEL_H_
|
#ifndef XENIA_KERNEL_KERNEL_H_
|
||||||
#define XENIA_KERNEL_KERNEL_H_
|
#define XENIA_KERNEL_KERNEL_H_
|
||||||
|
|
||||||
#include <xenia/kernel/runtime.h>
|
#include <xenia/kernel/modules.h>
|
||||||
#include <xenia/kernel/modules/modules.h>
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_KERNEL_H_
|
#endif // XENIA_KERNEL_KERNEL_H_
|
||||||
|
|
|
@ -9,21 +9,20 @@
|
||||||
|
|
||||||
#include <xenia/kernel/kernel_module.h>
|
#include <xenia/kernel/kernel_module.h>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/emulator.h>
|
||||||
#include <xenia/kernel/runtime.h>
|
#include <xenia/export_resolver.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
using namespace xe::kernel;
|
using namespace xe::kernel;
|
||||||
|
|
||||||
|
|
||||||
KernelModule::KernelModule(Runtime* runtime) {
|
KernelModule::KernelModule(Emulator* emulator) :
|
||||||
runtime_ = runtime;
|
emulator_(emulator) {
|
||||||
memory_ = runtime->memory();
|
memory_ = xe_memory_retain(emulator_->memory());
|
||||||
export_resolver_ = runtime->export_resolver();
|
export_resolver_ = emulator->export_resolver();
|
||||||
}
|
}
|
||||||
|
|
||||||
KernelModule::~KernelModule() {
|
KernelModule::~KernelModule() {
|
||||||
export_resolver_.reset();
|
|
||||||
xe_memory_release(memory_);
|
xe_memory_release(memory_);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,23 +14,23 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
|
|
||||||
|
XEDECLARECLASS1(xe, Emulator);
|
||||||
|
XEDECLARECLASS1(xe, ExportResolver);
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
|
|
||||||
|
|
||||||
class ExportResolver;
|
|
||||||
class Runtime;
|
|
||||||
|
|
||||||
|
|
||||||
class KernelModule {
|
class KernelModule {
|
||||||
public:
|
public:
|
||||||
KernelModule(Runtime* runtime);
|
KernelModule(Emulator* emulator);
|
||||||
virtual ~KernelModule();
|
virtual ~KernelModule();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Runtime* runtime_;
|
Emulator* emulator_;
|
||||||
xe_memory_ref memory_;
|
xe_memory_ref memory_;
|
||||||
shared_ptr<ExportResolver> export_resolver_;
|
ExportResolver* export_resolver_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#ifndef XENIA_KERNEL_MODULES_H_
|
#ifndef XENIA_KERNEL_MODULES_H_
|
||||||
#define XENIA_KERNEL_MODULES_H_
|
#define XENIA_KERNEL_MODULES_H_
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_module.h>
|
#include <xenia/kernel/xam/xam_module.h>
|
||||||
#include <xenia/kernel/modules/xboxkrnl/module.h>
|
#include <xenia/kernel/xboxkrnl/xboxkrnl_module.h>
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_H_
|
#endif // XENIA_KERNEL_MODULES_H_
|
|
@ -1,11 +0,0 @@
|
||||||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
|
||||||
{
|
|
||||||
'sources': [
|
|
||||||
'modules.h',
|
|
||||||
],
|
|
||||||
|
|
||||||
'includes': [
|
|
||||||
'xam/sources.gypi',
|
|
||||||
'xboxkrnl/sources.gypi',
|
|
||||||
],
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* 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_KERNEL_MODULES_XBOXKRNL_KERNEL_STATE_H_
|
|
||||||
#define XENIA_KERNEL_MODULES_XBOXKRNL_KERNEL_STATE_H_
|
|
||||||
|
|
||||||
#include <xenia/common.h>
|
|
||||||
#include <xenia/core.h>
|
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
|
||||||
#include <xenia/kernel/kernel_module.h>
|
|
||||||
#include <xenia/kernel/xbox.h>
|
|
||||||
#include <xenia/kernel/modules/xboxkrnl/object_table.h>
|
|
||||||
#include <xenia/kernel/modules/xboxkrnl/fs/filesystem.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
|
||||||
namespace cpu {
|
|
||||||
class Processor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
|
||||||
namespace kernel {
|
|
||||||
namespace xboxkrnl {
|
|
||||||
|
|
||||||
class XModule;
|
|
||||||
namespace fs {
|
|
||||||
class FileSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class KernelState {
|
|
||||||
public:
|
|
||||||
KernelState(Runtime* runtime);
|
|
||||||
~KernelState();
|
|
||||||
|
|
||||||
static KernelState* shared();
|
|
||||||
|
|
||||||
Runtime* runtime();
|
|
||||||
xe_memory_ref memory();
|
|
||||||
cpu::Processor* processor();
|
|
||||||
fs::FileSystem* filesystem();
|
|
||||||
|
|
||||||
ObjectTable* object_table() const;
|
|
||||||
|
|
||||||
XModule* GetModule(const char* name);
|
|
||||||
XModule* GetExecutableModule();
|
|
||||||
void SetExecutableModule(XModule* module);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Runtime* runtime_;
|
|
||||||
xe_memory_ref memory_;
|
|
||||||
shared_ptr<cpu::Processor> processor_;
|
|
||||||
shared_ptr<fs::FileSystem> filesystem_;
|
|
||||||
|
|
||||||
ObjectTable* object_table_;
|
|
||||||
xe_mutex_t* object_mutex_;
|
|
||||||
|
|
||||||
XModule* executable_module_;
|
|
||||||
|
|
||||||
friend class XObject;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace xboxkrnl
|
|
||||||
} // namespace kernel
|
|
||||||
} // namespace xe
|
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XBOXKRNL_KERNEL_STATE_H_
|
|
|
@ -1,136 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* 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. *
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <xenia/kernel/runtime.h>
|
|
||||||
|
|
||||||
#include <xenia/kernel/modules/modules.h>
|
|
||||||
#include <xenia/kernel/modules/xboxkrnl/fs/filesystem.h>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
|
||||||
using namespace xe::cpu;
|
|
||||||
using namespace xe::kernel;
|
|
||||||
using namespace xe::kernel::xboxkrnl::fs;
|
|
||||||
|
|
||||||
|
|
||||||
Runtime::Runtime(shared_ptr<cpu::Processor> processor,
|
|
||||||
const xechar_t* command_line) {
|
|
||||||
memory_ = processor->memory();
|
|
||||||
processor_ = processor;
|
|
||||||
XEIGNORE(xestrcpy(command_line_, XECOUNT(command_line_), command_line));
|
|
||||||
export_resolver_ = shared_ptr<ExportResolver>(new ExportResolver());
|
|
||||||
|
|
||||||
filesystem_ = shared_ptr<FileSystem>(new FileSystem());
|
|
||||||
|
|
||||||
xboxkrnl_ = auto_ptr<xboxkrnl::XboxkrnlModule>(
|
|
||||||
new xboxkrnl::XboxkrnlModule(this));
|
|
||||||
xam_ = auto_ptr<xam::XamModule>(
|
|
||||||
new xam::XamModule(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
Runtime::~Runtime() {
|
|
||||||
xe_memory_release(memory_);
|
|
||||||
}
|
|
||||||
|
|
||||||
const xechar_t* Runtime::command_line() {
|
|
||||||
return command_line_;
|
|
||||||
}
|
|
||||||
|
|
||||||
xe_memory_ref Runtime::memory() {
|
|
||||||
return xe_memory_retain(memory_);
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<cpu::Processor> Runtime::processor() {
|
|
||||||
return processor_;
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<ExportResolver> Runtime::export_resolver() {
|
|
||||||
return export_resolver_;
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<FileSystem> Runtime::filesystem() {
|
|
||||||
return filesystem_;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Runtime::LaunchXexFile(const xechar_t* path) {
|
|
||||||
// We create a virtual filesystem pointing to its directory and symlink
|
|
||||||
// that to the game filesystem.
|
|
||||||
// e.g., /my/files/foo.xex will get a local fs at:
|
|
||||||
// \\Device\\Harddisk0\\Partition1
|
|
||||||
// and then get that symlinked to game:\, so
|
|
||||||
// -> game:\foo.xex
|
|
||||||
|
|
||||||
int result_code = 0;
|
|
||||||
|
|
||||||
// Get just the filename (foo.xex).
|
|
||||||
const xechar_t* file_name = xestrrchr(path, XE_PATH_SEPARATOR);
|
|
||||||
if (file_name) {
|
|
||||||
// Skip slash.
|
|
||||||
file_name++;
|
|
||||||
} else {
|
|
||||||
// No slash found, whole thing is a file.
|
|
||||||
file_name = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the parent path of the file.
|
|
||||||
xechar_t parent_path[XE_MAX_PATH];
|
|
||||||
XEIGNORE(xestrcpy(parent_path, XECOUNT(parent_path), path));
|
|
||||||
parent_path[file_name - path] = 0;
|
|
||||||
|
|
||||||
// Register the local directory in the virtual filesystem.
|
|
||||||
result_code = filesystem_->RegisterHostPathDevice(
|
|
||||||
"\\Device\\Harddisk1\\Partition0", parent_path);
|
|
||||||
if (result_code) {
|
|
||||||
XELOGE("Unable to mount local directory");
|
|
||||||
return result_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create symlinks to the device.
|
|
||||||
filesystem_->CreateSymbolicLink(
|
|
||||||
"game:", "\\Device\\Harddisk1\\Partition0");
|
|
||||||
filesystem_->CreateSymbolicLink(
|
|
||||||
"d:", "\\Device\\Harddisk1\\Partition0");
|
|
||||||
|
|
||||||
// Get the file name of the module to load from the filesystem.
|
|
||||||
char fs_path[XE_MAX_PATH];
|
|
||||||
XEIGNORE(xestrcpya(fs_path, XECOUNT(fs_path), "game:\\"));
|
|
||||||
char* fs_path_ptr = fs_path + xestrlena(fs_path);
|
|
||||||
*fs_path_ptr = 0;
|
|
||||||
#if XE_WCHAR
|
|
||||||
XEIGNORE(xestrnarrow(fs_path_ptr, XECOUNT(fs_path), file_name));
|
|
||||||
#else
|
|
||||||
XEIGNORE(xestrcpya(fs_path_ptr, XECOUNT(fs_path), file_name));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Launch the game.
|
|
||||||
return xboxkrnl_->LaunchModule(fs_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Runtime::LaunchDiscImage(const xechar_t* path) {
|
|
||||||
int result_code = 0;
|
|
||||||
|
|
||||||
// Register the disc image in the virtual filesystem.
|
|
||||||
result_code = filesystem_->RegisterDiscImageDevice(
|
|
||||||
"\\Device\\Cdrom0", path);
|
|
||||||
if (result_code) {
|
|
||||||
XELOGE("Unable to mount disc image");
|
|
||||||
return result_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create symlinks to the device.
|
|
||||||
filesystem_->CreateSymbolicLink(
|
|
||||||
"game:",
|
|
||||||
"\\Device\\Cdrom0");
|
|
||||||
filesystem_->CreateSymbolicLink(
|
|
||||||
"d:",
|
|
||||||
"\\Device\\Cdrom0");
|
|
||||||
|
|
||||||
// Launch the game.
|
|
||||||
return xboxkrnl_->LaunchModule("game:\\default.xex");
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* 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_KERNEL_RUNTIME_H_
|
|
||||||
#define XENIA_KERNEL_RUNTIME_H_
|
|
||||||
|
|
||||||
#include <xenia/common.h>
|
|
||||||
#include <xenia/core.h>
|
|
||||||
#include <xenia/cpu/cpu.h>
|
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
|
||||||
#include <xenia/kernel/xex2.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
|
||||||
namespace cpu {
|
|
||||||
class Processor;
|
|
||||||
}
|
|
||||||
namespace kernel {
|
|
||||||
namespace xboxkrnl {
|
|
||||||
class XboxkrnlModule;
|
|
||||||
namespace fs {
|
|
||||||
class FileSystem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
namespace xam {
|
|
||||||
class XamModule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
|
||||||
namespace kernel {
|
|
||||||
|
|
||||||
class KernelModule;
|
|
||||||
|
|
||||||
|
|
||||||
class Runtime {
|
|
||||||
public:
|
|
||||||
Runtime(shared_ptr<cpu::Processor> processor, const xechar_t* command_line);
|
|
||||||
~Runtime();
|
|
||||||
|
|
||||||
const xechar_t* command_line();
|
|
||||||
|
|
||||||
xe_memory_ref memory();
|
|
||||||
shared_ptr<cpu::Processor> processor();
|
|
||||||
shared_ptr<ExportResolver> export_resolver();
|
|
||||||
shared_ptr<xboxkrnl::fs::FileSystem> filesystem();
|
|
||||||
|
|
||||||
int LaunchXexFile(const xechar_t* path);
|
|
||||||
int LaunchDiscImage(const xechar_t* path);
|
|
||||||
|
|
||||||
private:
|
|
||||||
xechar_t command_line_[XE_MAX_PATH];
|
|
||||||
|
|
||||||
xe_memory_ref memory_;
|
|
||||||
shared_ptr<cpu::Processor> processor_;
|
|
||||||
shared_ptr<ExportResolver> export_resolver_;
|
|
||||||
shared_ptr<xboxkrnl::fs::FileSystem> filesystem_;
|
|
||||||
|
|
||||||
auto_ptr<xboxkrnl::XboxkrnlModule> xboxkrnl_;
|
|
||||||
auto_ptr<xam::XamModule> xam_;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace kernel
|
|
||||||
} // namespace xe
|
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_RUNTIME_H_
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/cpu/ppc.h>
|
#include <xenia/cpu/ppc.h>
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/kernel/kernel_module.h>
|
#include <xenia/kernel/kernel_module.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,22 +1,19 @@
|
||||||
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
# Copyright 2013 Ben Vanik. All Rights Reserved.
|
||||||
{
|
{
|
||||||
'sources': [
|
'sources': [
|
||||||
'export.cc',
|
|
||||||
'export.h',
|
|
||||||
'kernel.h',
|
'kernel.h',
|
||||||
'kernel_module.cc',
|
'kernel_module.cc',
|
||||||
'kernel_module.h',
|
'kernel_module.h',
|
||||||
'runtime.cc',
|
'modules.h',
|
||||||
'runtime.h',
|
|
||||||
'shim_utils.h',
|
'shim_utils.h',
|
||||||
'xbox.h',
|
|
||||||
'xex2.cc',
|
'xex2.cc',
|
||||||
'xex2.h',
|
'xex2.h',
|
||||||
'xex2_info.h',
|
'xex2_info.h',
|
||||||
],
|
],
|
||||||
|
|
||||||
'includes': [
|
'includes': [
|
||||||
'modules/sources.gypi',
|
'xam/sources.gypi',
|
||||||
|
'xboxkrnl/sources.gypi',
|
||||||
'util/sources.gypi',
|
'util/sources.gypi',
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* // Build the export table used for resolution.
|
* // Build the export table used for resolution.
|
||||||
* #include <xenia/kernel/util/export_table_pre.inc>
|
* #include <xenia/kernel/util/export_table_pre.inc>
|
||||||
* static KernelExport my_module_export_table[] = {
|
* static KernelExport my_module_export_table[] = {
|
||||||
* #include <xenia/kernel/modules/my_module/my_module_table.inc>
|
* #include <xenia/kernel/my_module/my_module_table.inc>
|
||||||
* };
|
* };
|
||||||
* #include <xenia/kernel/util/export_table_post.inc>
|
* #include <xenia/kernel/util/export_table_post.inc>
|
||||||
* export_resolver_->RegisterTable(
|
* export_resolver_->RegisterTable(
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
* #include <xenia/kernel/util/ordinal_table_pre.inc>
|
* #include <xenia/kernel/util/ordinal_table_pre.inc>
|
||||||
* namespace ordinals {
|
* namespace ordinals {
|
||||||
* enum {
|
* enum {
|
||||||
* #include <xenia/kernel/modules/my_module/my_module_table.inc>
|
* #include <xenia/kernel/my_module/my_module_table.inc>
|
||||||
* };
|
* };
|
||||||
* } // namespace ordinals
|
* } // namespace ordinals
|
||||||
* #include <xenia/kernel/util/ordinal_table_post.inc>
|
* #include <xenia/kernel/util/ordinal_table_post.inc>
|
||||||
|
|
|
@ -7,11 +7,11 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_content.h>
|
#include <xenia/kernel/xam/xam_content.h>
|
||||||
|
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_CONTENT_H_
|
#ifndef XENIA_KERNEL_XAM_CONTENT_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_CONTENT_H_
|
#define XENIA_KERNEL_XAM_CONTENT_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/xbox.h>
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -28,4 +28,4 @@ namespace xam {
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_CONTENT_H_
|
#endif // XENIA_KERNEL_XAM_CONTENT_H_
|
|
@ -7,12 +7,12 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_info.h>
|
#include <xenia/kernel/xam/xam_info.h>
|
||||||
|
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/xex2.h>
|
#include <xenia/kernel/xex2.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_INFO_H_
|
#ifndef XENIA_KERNEL_XAM_INFO_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_INFO_H_
|
#define XENIA_KERNEL_XAM_INFO_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/xbox.h>
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -28,4 +28,4 @@ namespace xam {
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_INFO_H_
|
#endif // XENIA_KERNEL_XAM_INFO_H_
|
|
@ -7,11 +7,11 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_input.h>
|
#include <xenia/kernel/xam/xam_input.h>
|
||||||
|
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_INPUT_H_
|
#ifndef XENIA_KERNEL_XAM_INPUT_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_INPUT_H_
|
#define XENIA_KERNEL_XAM_INPUT_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/xbox.h>
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -28,4 +28,4 @@ namespace xam {
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_INPUT_H_
|
#endif // XENIA_KERNEL_XAM_INPUT_H_
|
|
@ -7,11 +7,11 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_module.h>
|
#include <xenia/kernel/xam/xam_module.h>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
|
@ -22,31 +22,31 @@ using namespace xe::kernel::xam;
|
||||||
XamState* xe::kernel::xam::shared_xam_state_ = NULL;
|
XamState* xe::kernel::xam::shared_xam_state_ = NULL;
|
||||||
|
|
||||||
|
|
||||||
XamModule::XamModule(Runtime* runtime) :
|
XamModule::XamModule(Emulator* emulator) :
|
||||||
KernelModule(runtime) {
|
KernelModule(emulator) {
|
||||||
// Build the export table used for resolution.
|
// Build the export table used for resolution.
|
||||||
#include <xenia/kernel/util/export_table_pre.inc>
|
#include <xenia/kernel/util/export_table_pre.inc>
|
||||||
static KernelExport xam_export_table[] = {
|
static KernelExport xam_export_table[] = {
|
||||||
#include <xenia/kernel/modules/xam/xam_table.inc>
|
#include <xenia/kernel/xam/xam_table.inc>
|
||||||
};
|
};
|
||||||
#include <xenia/kernel/util/export_table_post.inc>
|
#include <xenia/kernel/util/export_table_post.inc>
|
||||||
export_resolver_->RegisterTable(
|
export_resolver_->RegisterTable(
|
||||||
"xam.xex", xam_export_table, XECOUNT(xam_export_table));
|
"xam.xex", xam_export_table, XECOUNT(xam_export_table));
|
||||||
|
|
||||||
// Setup the xam state instance.
|
// Setup the xam state instance.
|
||||||
xam_state = auto_ptr<XamState>(new XamState(memory_, export_resolver_));
|
xam_state_ = new XamState(emulator);
|
||||||
|
|
||||||
// Setup the shared global state object.
|
// Setup the shared global state object.
|
||||||
XEASSERTNULL(shared_xam_state_);
|
XEASSERTNULL(shared_xam_state_);
|
||||||
shared_xam_state_ = xam_state.get();
|
shared_xam_state_ = xam_state_;
|
||||||
|
|
||||||
// Register all exported functions.
|
// Register all exported functions.
|
||||||
RegisterContentExports(export_resolver_.get(), xam_state.get());
|
RegisterContentExports(export_resolver_, xam_state_);
|
||||||
RegisterInfoExports(export_resolver_.get(), xam_state.get());
|
RegisterInfoExports(export_resolver_, xam_state_);
|
||||||
RegisterInputExports(export_resolver_.get(), xam_state.get());
|
RegisterInputExports(export_resolver_, xam_state_);
|
||||||
RegisterNetExports(export_resolver_.get(), xam_state.get());
|
RegisterNetExports(export_resolver_, xam_state_);
|
||||||
RegisterUserExports(export_resolver_.get(), xam_state.get());
|
RegisterUserExports(export_resolver_, xam_state_);
|
||||||
RegisterVideoExports(export_resolver_.get(), xam_state.get());
|
RegisterVideoExports(export_resolver_, xam_state_);
|
||||||
}
|
}
|
||||||
|
|
||||||
XamModule::~XamModule() {
|
XamModule::~XamModule() {
|
|
@ -7,18 +7,18 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_H_
|
#ifndef XENIA_KERNEL_XAM_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_H_
|
#define XENIA_KERNEL_XAM_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/kernel/kernel_module.h>
|
#include <xenia/kernel/kernel_module.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_ordinals.h>
|
#include <xenia/kernel/xam/xam_ordinals.h>
|
||||||
|
|
||||||
// All of the exported functions:
|
// All of the exported functions:
|
||||||
#include <xenia/kernel/modules/xam/xam_info.h>
|
#include <xenia/kernel/xam/xam_info.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -30,11 +30,11 @@ class XamState;
|
||||||
|
|
||||||
class XamModule : public KernelModule {
|
class XamModule : public KernelModule {
|
||||||
public:
|
public:
|
||||||
XamModule(Runtime* runtime);
|
XamModule(Emulator* emulator);
|
||||||
virtual ~XamModule();
|
virtual ~XamModule();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
auto_ptr<XamState> xam_state;
|
XamState* xam_state_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,4 +43,4 @@ private:
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_H_
|
#endif // XENIA_KERNEL_XAM_H_
|
|
@ -7,11 +7,11 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_net.h>
|
#include <xenia/kernel/xam/xam_net.h>
|
||||||
|
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_NET_H_
|
#ifndef XENIA_KERNEL_XAM_NET_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_NET_H_
|
#define XENIA_KERNEL_XAM_NET_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/xbox.h>
|
#include <xenia/xbox.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
|
@ -28,4 +28,4 @@ namespace xam {
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_NET_H_
|
#endif // XENIA_KERNEL_XAM_NET_H_
|
|
@ -1,29 +1,29 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_ORDINALS_H_
|
#ifndef XENIA_KERNEL_XAM_ORDINALS_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_ORDINALS_H_
|
#define XENIA_KERNEL_XAM_ORDINALS_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
|
|
||||||
|
|
||||||
// Build an ordinal enum to make it easy to lookup ordinals.
|
// Build an ordinal enum to make it easy to lookup ordinals.
|
||||||
#include <xenia/kernel/util/ordinal_table_pre.inc>
|
#include <xenia/kernel/util/ordinal_table_pre.inc>
|
||||||
namespace ordinals {
|
namespace ordinals {
|
||||||
enum {
|
enum {
|
||||||
#include <xenia/kernel/modules/xam/xam_table.inc>
|
#include <xenia/kernel/xam/xam_table.inc>
|
||||||
};
|
};
|
||||||
} // namespace ordinals
|
} // namespace ordinals
|
||||||
#include <xenia/kernel/util/ordinal_table_post.inc>
|
#include <xenia/kernel/util/ordinal_table_post.inc>
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_ORDINALS_H_
|
#endif // XENIA_KERNEL_XAM_ORDINALS_H_
|
|
@ -1,46 +1,46 @@
|
||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Xenia : Xbox 360 Emulator Research Project *
|
* Xenia : Xbox 360 Emulator Research Project *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* Copyright 2013 Ben Vanik. All rights reserved. *
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
||||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_PRIVATE_H_
|
#ifndef XENIA_KERNEL_XAM_PRIVATE_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_PRIVATE_H_
|
#define XENIA_KERNEL_XAM_PRIVATE_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_ordinals.h>
|
#include <xenia/kernel/xam/xam_ordinals.h>
|
||||||
|
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace kernel {
|
namespace kernel {
|
||||||
namespace xam {
|
namespace xam {
|
||||||
|
|
||||||
class XamState;
|
class XamState;
|
||||||
|
|
||||||
|
|
||||||
// This is a global object initialized with the XamModule.
|
// This is a global object initialized with the XamModule.
|
||||||
// It references the current xam state object that all xam methods should
|
// It references the current xam state object that all xam methods should
|
||||||
// be using to stash their variables.
|
// be using to stash their variables.
|
||||||
extern XamState* shared_xam_state_;
|
extern XamState* shared_xam_state_;
|
||||||
|
|
||||||
|
|
||||||
// Registration functions, one per file.
|
// Registration functions, one per file.
|
||||||
void RegisterContentExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterContentExports(ExportResolver* export_resolver, XamState* state);
|
||||||
void RegisterInfoExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterInfoExports(ExportResolver* export_resolver, XamState* state);
|
||||||
void RegisterInputExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterInputExports(ExportResolver* export_resolver, XamState* state);
|
||||||
void RegisterNetExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterNetExports(ExportResolver* export_resolver, XamState* state);
|
||||||
void RegisterUserExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterUserExports(ExportResolver* export_resolver, XamState* state);
|
||||||
void RegisterVideoExports(ExportResolver* export_resolver, XamState* state);
|
void RegisterVideoExports(ExportResolver* export_resolver, XamState* state);
|
||||||
|
|
||||||
|
|
||||||
} // namespace xam
|
} // namespace xam
|
||||||
} // namespace kernel
|
} // namespace kernel
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_PRIVATE_H_
|
#endif // XENIA_KERNEL_XAM_PRIVATE_H_
|
|
@ -7,7 +7,9 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xenia/kernel/modules/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
|
@ -20,12 +22,12 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
XamState::XamState(xe_memory_ref memory,
|
XamState::XamState(Emulator* emulator) :
|
||||||
shared_ptr<ExportResolver> export_resolver) {
|
emulator_(emulator) {
|
||||||
this->memory = xe_memory_retain(memory);
|
memory_ = xe_memory_retain(emulator->memory());
|
||||||
export_resolver_ = export_resolver;
|
export_resolver_ = emulator->export_resolver();
|
||||||
}
|
}
|
||||||
|
|
||||||
XamState::~XamState() {
|
XamState::~XamState() {
|
||||||
xe_memory_release(memory);
|
xe_memory_release(memory_);
|
||||||
}
|
}
|
|
@ -7,13 +7,13 @@
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef XENIA_KERNEL_MODULES_XAM_XAM_STATE_H_
|
#ifndef XENIA_KERNEL_XAM_XAM_STATE_H_
|
||||||
#define XENIA_KERNEL_MODULES_XAM_XAM_STATE_H_
|
#define XENIA_KERNEL_XAM_XAM_STATE_H_
|
||||||
|
|
||||||
#include <xenia/common.h>
|
#include <xenia/common.h>
|
||||||
#include <xenia/core.h>
|
#include <xenia/core.h>
|
||||||
|
|
||||||
#include <xenia/kernel/export.h>
|
#include <xenia/export_resolver.h>
|
||||||
#include <xenia/kernel/kernel_module.h>
|
#include <xenia/kernel/kernel_module.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,13 +24,15 @@ namespace xam {
|
||||||
|
|
||||||
class XamState {
|
class XamState {
|
||||||
public:
|
public:
|
||||||
XamState(xe_memory_ref memory, shared_ptr<ExportResolver> export_resolver);
|
XamState(Emulator* emulator);
|
||||||
~XamState();
|
~XamState();
|
||||||
|
|
||||||
xe_memory_ref memory;
|
xe_memory_ref memory() const { return memory_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
shared_ptr<ExportResolver> export_resolver_;
|
Emulator* emulator_;
|
||||||
|
xe_memory_ref memory_;
|
||||||
|
ExportResolver* export_resolver_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,4 +41,4 @@ private:
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
#endif // XENIA_KERNEL_MODULES_XAM_XAM_STATE_H_
|
#endif // XENIA_KERNEL_XAM_XAM_STATE_H_
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue