31 changed files with 623 additions and 175 deletions
-
5src/common/common.h
-
1src/core/CMakeLists.txt
-
3src/core/arm/arm_interface.h
-
1src/core/arm/interpreter/arm_interpreter.h
-
2src/core/arm/interpreter/armemu.cpp
-
12src/core/arm/interpreter/armsupp.cpp
-
2src/core/core.vcxproj
-
6src/core/core.vcxproj.filters
-
8src/core/hle/hle.cpp
-
2src/core/hle/hle.h
-
64src/core/hle/mrc.cpp
-
20src/core/hle/mrc.h
-
6src/core/hle/service/apt.cpp
-
4src/core/hle/service/apt.h
-
113src/core/hle/service/gsp.cpp
-
3src/core/hle/service/gsp.h
-
2src/core/hle/service/hid.cpp
-
3src/core/hle/service/hid.h
-
40src/core/hle/service/service.h
-
6src/core/hle/service/srv.cpp
-
3src/core/hle/service/srv.h
-
42src/core/hle/syscall.cpp
-
76src/core/hw/hw.cpp
-
103src/core/hw/lcd.cpp
-
73src/core/hw/lcd.h
-
14src/core/mem_map.cpp
-
53src/core/mem_map.h
-
111src/core/mem_map_funcs.cpp
-
4src/video_core/renderer_base.h
-
11src/video_core/renderer_opengl/renderer_opengl.cpp
-
5src/video_core/renderer_opengl/renderer_opengl.h
@ -0,0 +1,64 @@ |
|||
// Copyright 2014 Citra Emulator Project
|
|||
// Licensed under GPLv2
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include "core/hle/mrc.h"
|
|||
#include "core/hle/hle.h"
|
|||
#include "core/mem_map.h"
|
|||
#include "core/core.h"
|
|||
|
|||
namespace HLE { |
|||
|
|||
enum { |
|||
CMD_GX_REQUEST_DMA = 0x00000000, |
|||
}; |
|||
|
|||
/// Data synchronization barrier
|
|||
u32 DataSynchronizationBarrier(u32* command_buffer) { |
|||
u32 command = command_buffer[0]; |
|||
|
|||
switch (command) { |
|||
|
|||
case CMD_GX_REQUEST_DMA: |
|||
{ |
|||
u32* src = (u32*)Memory::GetPointer(command_buffer[1]); |
|||
u32* dst = (u32*)Memory::GetPointer(command_buffer[2]); |
|||
u32 size = command_buffer[3]; |
|||
memcpy(dst, src, size); |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
ERROR_LOG(OSHLE, "MRC::DataSynchronizationBarrier unknown command 0x%08X", command); |
|||
return -1; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
/// Returns the coprocessor (in this case, syscore) command buffer pointer
|
|||
Addr GetThreadCommandBuffer() { |
|||
// Called on insruction: mrc p15, 0, r0, c13, c0, 3
|
|||
// Returns an address in OSHLE memory for the CPU to read/write to
|
|||
RETURN(CMD_BUFFER_ADDR); |
|||
return CMD_BUFFER_ADDR; |
|||
} |
|||
|
|||
/// Call an MRC operation in HLE
|
|||
u32 CallMRC(ARM11_MRC_OPERATION operation) { |
|||
switch (operation) { |
|||
|
|||
case DATA_SYNCHRONIZATION_BARRIER: |
|||
return DataSynchronizationBarrier((u32*)Memory::GetPointer(PARAM(0))); |
|||
|
|||
case CALL_GET_THREAD_COMMAND_BUFFER: |
|||
return GetThreadCommandBuffer(); |
|||
|
|||
default: |
|||
ERROR_LOG(OSHLE, "unimplemented MRC operation 0x%02X", operation); |
|||
break; |
|||
} |
|||
return -1; |
|||
} |
|||
|
|||
} // namespace
|
|||
@ -0,0 +1,20 @@ |
|||
// Copyright 2014 Citra Emulator Project |
|||
// Licensed under GPLv2 |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
|
|||
namespace HLE { |
|||
|
|||
/// MRC operations (ARM register from coprocessor), decoded as instr[20:27] |
|||
enum ARM11_MRC_OPERATION { |
|||
DATA_SYNCHRONIZATION_BARRIER = 0xE0, |
|||
CALL_GET_THREAD_COMMAND_BUFFER = 0xE1, |
|||
}; |
|||
|
|||
/// Call an MRC operation in HLE |
|||
u32 CallMRC(ARM11_MRC_OPERATION operation); |
|||
|
|||
} // namespace |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue