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