diff --git a/.travis.yml b/.travis.yml index f34b33dfcf..90ddcfd4de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ before_install: - echo "yes" | sudo apt-add-repository 'deb http://repos.codelite.org/wx3.0/ubuntu/ precise universe' - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt-get update - - sudo apt-get install libwxgtk3.0-dev libopenal-dev freeglut3-dev libglew-dev + - sudo apt-get install libwxgtk3.0-dev libopenal-dev freeglut3-dev libglew-dev libc6-dev - sudo apt-get install aria2 -qq - download_extract() { aria2c -x 16 $1 -o $2 && tar -xf $2; } - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; export CXX="g++-4.8" CC="gcc-4.8"; else sudo apt-get install libstdc++-4.8-dev; fi diff --git a/Utilities/AutoPause.cpp b/Utilities/AutoPause.cpp index 5182d91aad..fc2e26ad6d 100644 --- a/Utilities/AutoPause.cpp +++ b/Utilities/AutoPause.cpp @@ -16,7 +16,7 @@ AutoPause& AutoPause::getInstance(void) return *gAutoPause; } -//Still use binary format. Default Setting should be "disable all auto-pause". +//Still use binary format. Default Setting should be "disable all auto pause". AutoPause::AutoPause(void) { m_pause_function.reserve(16); @@ -36,7 +36,7 @@ AutoPause::~AutoPause(void) m_pause_syscall_enable = false; } -//Load Auto-Pause Configuration from file "pause.bin" +//Load Auto Pause Configuration from file "pause.bin" //This would be able to create in a GUI window. void AutoPause::Reload(void) { @@ -65,19 +65,19 @@ void AutoPause::Reload(void) //Less than 1024 - be regarded as a system call. //emplace_back may not cause reductant move/copy operation. m_pause_syscall.emplace_back(num); - LOG_WARNING(HLE, "Auto-Pause: Find System Call ID %x", num); + LOG_WARNING(HLE, "Auto Pause: Find System Call ID %x", num); } else { m_pause_function.emplace_back(num); - LOG_WARNING(HLE, "Auto-Pause: Find Function Call ID %x", num); + LOG_WARNING(HLE, "Auto Pause: Find Function Call ID %x", num); } } list.Close(); } else { - LOG_WARNING(HLE, "No Pause ID specified in pause.bin, Auto-Pause would not act."); + LOG_WARNING(HLE, "No pause.bin found, Auto Pause will not work."); } m_pause_syscall_enable = Ini.DBGAutoPauseSystemCall.GetValue(); m_pause_function_enable = Ini.DBGAutoPauseFunctionCall.GetValue(); @@ -99,7 +99,7 @@ void AutoPause::TryPause(u32 code) { if (code == m_pause_syscall[i]) { Emu.Pause(); - LOG_ERROR(HLE, "Auto-Pause Triggered: System call %x", code); //Used Error + LOG_ERROR(HLE, "Auto Pause Triggered: System call %x", code); //Used Error } } } @@ -117,7 +117,7 @@ void AutoPause::TryPause(u32 code) { if (code == m_pause_function[i]) { Emu.Pause(); - LOG_ERROR(HLE, "Auto-Pause Triggered: Function call %x", code); //Used Error + LOG_ERROR(HLE, "Auto Pause Triggered: Function call %x", code); //Used Error } } } diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index af6d412e96..ac37e04a83 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -238,17 +238,17 @@ struct CellGcmSurface u8 colorFormat; u8 colorTarget; u8 colorLocation[4]; - u32 colorOffset[4]; - u32 colorPitch[4]; + be_t colorOffset[4]; + be_t colorPitch[4]; u8 depthFormat; u8 depthLocation; u8 _padding[2]; - u32 depthOffset; - u32 depthPitch; - u16 width; - u16 height; - u16 x; - u16 y; + be_t depthOffset; + be_t depthPitch; + be_t width; + be_t height; + be_t x; + be_t y; }; struct CellGcmReportData @@ -268,6 +268,14 @@ struct CellGcmZcullInfo u32 status1; }; +struct CellGcmDisplayInfo +{ + be_t offset; + be_t pitch; + be_t width; + be_t height; +}; + struct CellGcmTileInfo { be_t tile; diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index bfb96fd2bb..b36279f580 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -267,9 +267,8 @@ std::string GLFragmentDecompilerThread::BuildCode() std::string p; - for (u32 i = 0; i 0 ? exp2($0.w * log2($0.y)) : 0.0), 1.0)"); break; // LIT (compute light coefficients) - case 0x1f: SetDst("($0 * ($1 - $2) + $2)"); break; // LRP (linear interpolation) + case RSX_FP_OPCODE_FRC: SetDst("fract($0)"); break; + case RSX_FP_OPCODE_FLR: SetDst("floor($0)"); break; + case RSX_FP_OPCODE_KIL: SetDst("discard", false); break; + //case RSX_FP_OPCODE_PK4: break; + //case RSX_FP_OPCODE_UP4: break; + case RSX_FP_OPCODE_DDX: SetDst("dFdx($0)"); break; + case RSX_FP_OPCODE_DDY: SetDst("dFdy($0)"); break; + case RSX_FP_OPCODE_TEX: SetDst("texture($t, $0.xy)"); break; + //case RSX_FP_OPCODE_TXP: break; + //case RSX_FP_OPCODE_TXD: break; + case RSX_FP_OPCODE_RCP: SetDst("(1 / $0)"); break; + case RSX_FP_OPCODE_RSQ: SetDst("inversesqrt(abs($0))"); break; + case RSX_FP_OPCODE_EX2: SetDst("exp2($0)"); break; + case RSX_FP_OPCODE_LG2: SetDst("log2($0)"); break; + case RSX_FP_OPCODE_LIT: SetDst("vec4(1.0, $0.x, ($0.x > 0 ? exp2($0.w * log2($0.y)) : 0.0), 1.0)"); break; + case RSX_FP_OPCODE_LRP: SetDst("($0 * ($1 - $2) + $2)"); break; - case 0x20: SetDst("vec4(equal($0, vec4(1.0)))"); break; // STR (set on true) - case 0x21: SetDst("vec4(equal($0, vec4(0.0)))"); break; // SFL (set on false) - case 0x22: SetDst("cos($0)"); break; // COS - case 0x23: SetDst("sin($0)"); break; // SIN - //case 0x24: break; // PK2 (pack two 16-bit floats) - //case 0x25: break; // UP2 (unpack two 16-bit floats) - case 0x26: SetDst("pow($0, $1)"); break; // POW - //case 0x27: break; // PKB - //case 0x28: break; // UPB - //case 0x29: break; // PK16 - //case 0x2a: break; // UP16 - //case 0x2b: break; // BEM - //case 0x2c: break; // PKG - //case 0x2d: break; // UPG - case 0x2e: SetDst("($0.x * $1.x + $0.y * $1.y + $2.x)"); break; // DP2A (2-component dot product and add) - //case 0x2f: break; // TXL (texture lookup with LOD) + case RSX_FP_OPCODE_STR: SetDst("vec4(equal($0, vec4(1.0)))"); break; + case RSX_FP_OPCODE_SFL: SetDst("vec4(equal($0, vec4(0.0)))"); break; + case RSX_FP_OPCODE_COS: SetDst("cos($0)"); break; + case RSX_FP_OPCODE_SIN: SetDst("sin($0)"); break; + //case RSX_FP_OPCODE_PK2: break; + //case RSX_FP_OPCODE_UP2: break; + case RSX_FP_OPCODE_POW: SetDst("pow($0, $1)"); break; + //case RSX_FP_OPCODE_PKB: break; + //case RSX_FP_OPCODE_UPB: break; + //case RSX_FP_OPCODE_PK16: break; + //case RSX_FP_OPCODE_UP16: break; + //case RSX_FP_OPCODE_BEM: break; + //case RSX_FP_OPCODE_PKG: break; + //case RSX_FP_OPCODE_UPG: break; + case RSX_FP_OPCODE_DP2A: SetDst("($0.x * $1.x + $0.y * $1.y + $2.x)"); break; + //case RSX_FP_OPCODE_TXL: break; - //case 0x30: break; - //case 0x31: break; // TXB (texture lookup with bias) - //case 0x33: break; // TEXBEM - //case 0x34: break; // TXPBEM - //case 0x35: break; // BEMLUM - case 0x36: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; // RFL (reflection vector) - //case 0x37: break; // TIMESWTEX - case 0x38: SetDst("vec4(dot($0.xy, $1.xy))"); break; // DP2 - case 0x39: SetDst("normalize($0.xyz)"); break; // NRM - case 0x3a: SetDst("($0 / $1)"); break; // DIV - case 0x3b: SetDst("($0 / sqrt($1))"); break; // DIVSQ - case 0x3c: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; // LIF - case 0x3d: break; // FENCT - case 0x3e: break; // FENCB + //case RSX_FP_OPCODE_TXB: break; + //case RSX_FP_OPCODE_TEXBEM: break; + //case RSX_FP_OPCODE_TXPBEM: break; + //case RSX_FP_OPCODE_BEMLUM: break; + case RSX_FP_OPCODE_REFL: SetDst("($0 - 2.0 * $1 * dot($0, $1))"); break; + //case RSX_FP_OPCODE_TIMESWTEX: break; + case RSX_FP_OPCODE_DP2: SetDst("vec4(dot($0.xy, $1.xy))"); break; + case RSX_FP_OPCODE_NRM: SetDst("normalize($0.xyz)"); break; + case RSX_FP_OPCODE_DIV: SetDst("($0 / $1)"); break; + case RSX_FP_OPCODE_DIVSQ: SetDst("($0 / sqrt($1))"); break; + case RSX_FP_OPCODE_LIF: SetDst("vec4(1.0, $0.y, ($0.y > 0 ? pow(2.0, $0.w) : 0.0), 1.0)"); break; + case RSX_FP_OPCODE_FENCT: break; + case RSX_FP_OPCODE_FENCB: break; - case 0x40: SetDst("break"); break; //BRK - //case 0x41: break; //CAL - case 0x42: - AddCode("if($cond)"); //IF + case RSX_FP_OPCODE_BRK: SetDst("break"); break; + //case RSX_FP_OPCODE_CAL: break; + case RSX_FP_OPCODE_IFE: + AddCode("if($cond)"); m_else_offsets.push_back(src1.else_offset << 2); m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; break; - case 0x43: //LOOP + case RSX_FP_OPCODE_LOOP: if(!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //LOOP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3, src2.end_offset)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); } else { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) //LOOP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); m_loop_count++; m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; } break; - case 0x44: //REP + case RSX_FP_OPCODE_REP: if(!src0.exec_if_eq && !src0.exec_if_gr && !src0.exec_if_lt) { AddCode(fmt::Format("$ifcond for(int i%u = %u; i%u < %u; i%u += %u) {} //-> %u //REP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3, src2.end_offset)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment, src2.end_offset)); } else { AddCode(fmt::Format("if($cond) for(int i%u = %u; i%u < %u; i%u += %u) //REP", - m_loop_count, src1.rep2, m_loop_count, src1.rep1, m_loop_count, src1.rep3)); + m_loop_count, src1.init_counter, m_loop_count, src1.end_counter, m_loop_count, src1.increment)); m_loop_count++; m_end_offsets.push_back(src2.end_offset << 2); AddCode("{"); m_code_level++; } break; - //case 0x45: SetDst("return"); break; //RET + //case RSX_FP_OPCODE_RET: SetDst("return"); break; default: LOG_ERROR(RSX, "Unknown fp opcode 0x%x (inst %d)", opcode, m_size / (4 * 4)); @@ -543,10 +541,9 @@ void GLShaderProgram::Compile() void GLShaderProgram::Delete() { - for (u32 i = 0; i= 1 && m_vertex_data[i].type <= 7) + if (m_vertex_data[i].type < 1 && m_vertex_data[i].type > 7) { + LOG_ERROR(RSX, "GLGSRender::EnableVertexData: Bad vertex data type (%d)!", m_vertex_data[i].type); + } + + if(!m_vertex_data[i].addr) { - if(!m_vertex_data[i].addr) + switch(m_vertex_data[i].type) { - switch(m_vertex_data[i].type) + case CELL_GCM_VERTEX_S32K: + case CELL_GCM_VERTEX_S1: + switch(m_vertex_data[i].size) { - case CELL_GCM_VERTEX_S32K: - case CELL_GCM_VERTEX_S1: - switch(m_vertex_data[i].size) - { - case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break; - case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; - } - break; - - case CELL_GCM_VERTEX_F: - switch(m_vertex_data[i].size) - { - case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break; - case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; - } - break; - - case CELL_GCM_VERTEX_CMP: - case CELL_GCM_VERTEX_UB: - glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]); - break; + case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break; + case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; + case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; + case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; } + break; - checkForGlError("glVertexAttrib"); - } - else - { - u32 gltype = gl_types[m_vertex_data[i].type - 1]; - bool normalized = gl_normalized[m_vertex_data[i].type - 1]; + case CELL_GCM_VERTEX_F: + switch(m_vertex_data[i].size) + { + case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break; + case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; + } + break; - glEnableVertexAttribArray(i); - checkForGlError("glEnableVertexAttribArray"); - glVertexAttribPointer(i, m_vertex_data[i].size, gltype, normalized, 0, reinterpret_cast(offset_list[i])); - checkForGlError("glVertexAttribPointer"); + case CELL_GCM_VERTEX_CMP: + case CELL_GCM_VERTEX_UB: + glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]); + break; } + + checkForGlError("glVertexAttrib"); + } + else + { + u32 gltype = gl_types[m_vertex_data[i].type - 1]; + bool normalized = gl_normalized[m_vertex_data[i].type - 1]; + + glEnableVertexAttribArray(i); + checkForGlError("glEnableVertexAttribArray"); + glVertexAttribPointer(i, m_vertex_data[i].size, gltype, normalized, 0, reinterpret_cast(offset_list[i])); + checkForGlError("glVertexAttribPointer"); } } } @@ -265,15 +267,15 @@ void GLGSRender::DisableVertexData() void GLGSRender::InitVertexData() { - GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; int l; + GLfloat scaleOffsetMat[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; - for(u32 i=0; ioffset; //LOG_WARNING(RSX,"fc%u[0x%x - 0x%x] = (%f, %f, %f, %f)", id, c.id, m_cur_shader_prog->offset, c.x, c.y, c.z, c.w); @@ -1272,13 +1271,13 @@ void GLGSRender::Flip() if (m_read_buffer) { format = GL_BGRA; - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); - u32 addr = GetAddress(re(buffers[m_gcm_current_buffer].offset), CELL_GCM_LOCATION_LOCAL); + CellGcmDisplayInfo* buffers = (CellGcmDisplayInfo*)Memory.GetMemFromAddr(m_gcm_buffers_addr); + u32 addr = GetAddress(buffers[m_gcm_current_buffer].offset, CELL_GCM_LOCATION_LOCAL); if (Memory.IsGoodAddr(addr)) { - width = re(buffers[m_gcm_current_buffer].width); - height = re(buffers[m_gcm_current_buffer].height); + width = buffers[m_gcm_current_buffer].width; + height = buffers[m_gcm_current_buffer].height; src_buffer = (u8*)Memory.VirtualToRealAddr(addr); } else diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 4e3827df55..22d666cf6b 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -175,10 +175,10 @@ std::string GLVertexDecompilerThread::GetFunc() { std::string name = "func$a"; - for(uint i=0; i= 2) { + m_vertex_data_base_index = ARGS(1); + } + } + break; + + case NV4097_SET_VERTEX_DATA_BASE_INDEX: + { + m_vertex_data_base_index = ARGS(0); + } + break; + case NV4097_SET_BEGIN_END: { const u32 a0 = ARGS(0); @@ -1320,9 +1337,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t args, const u32 case 2: m_surface_pitch_a = ARGS(1); } - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); - m_width = re(buffers[m_gcm_current_buffer].width); - m_height = re(buffers[m_gcm_current_buffer].height); + CellGcmDisplayInfo* buffers = (CellGcmDisplayInfo*)Memory.GetMemFromAddr(m_gcm_buffers_addr); + m_width = buffers[m_gcm_current_buffer].width; + m_height = buffers[m_gcm_current_buffer].height; // Rescale native resolution to fit 1080p/720p/480p/576p window size nativeRescale((float)m_width, (float)m_height); diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 8e8f592362..eb2c85e246 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -36,7 +36,7 @@ struct RSXVertexData void Reset(); bool IsEnabled() const { return size > 0; } - void Load(u32 start, u32 count); + void Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex); u32 GetTypeSize(); }; @@ -412,6 +412,10 @@ public: u8 m_shader_window_origin; u16 m_shader_window_pixel_centers; + // Vertex Data + u32 m_vertex_data_base_offset; + u32 m_vertex_data_base_index; + // Front face bool m_set_front_face; u32 m_front_face; @@ -505,8 +509,9 @@ protected: m_line_width = 1.0; m_line_stipple_pattern = 0xffff; m_line_stipple_factor = 1; - for (size_t i = 0; i < 32; i++) - { + m_vertex_data_base_offset = 0; + m_vertex_data_base_index = 0; + for (size_t i = 0; i < 32; i++) { m_polygon_stipple_pattern[i] = 0xFFFFFFFF; } @@ -624,7 +629,7 @@ protected: { if(!m_vertex_data[i].IsEnabled()) continue; - m_vertex_data[i].Load(first, count); + m_vertex_data[i].Load(first, count, m_vertex_data_base_offset, m_vertex_data_base_index); } } diff --git a/rpcs3/Emu/SysCalls/ModuleManager.cpp b/rpcs3/Emu/SysCalls/ModuleManager.cpp index 76df8fb2f7..8c919c7cb3 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.cpp +++ b/rpcs3/Emu/SysCalls/ModuleManager.cpp @@ -13,52 +13,50 @@ extern void cellFont_init(); extern void cellFont_load(); extern void cellFont_unload(); extern Module *cellFont; -extern void sys_net_init(); -extern Module *sys_net; -extern void cellUserInfo_init(); -extern Module *cellUserInfo; -extern void cellSysutil_init(); -extern Module *cellSysutil; -extern void cellSysutilAp_init(); -extern Module *cellSysutilAp; -extern void cellPngDec_init(); -extern Module *cellPngDec; -extern void cellNetCtl_init(); -extern Module *cellNetCtl; -extern void cellJpgDec_init(); -extern Module *cellJpgDec; extern void cellFontFT_init(); extern void cellFontFT_load(); extern void cellFontFT_unload(); extern Module *cellFontFT; -extern void cellGifDec_init(); -extern Module *cellGifDec; +extern void cellGame_init(); +extern Module *cellGame; extern void cellGcmSys_init(); extern void cellGcmSys_load(); extern void cellGcmSys_unload(); extern Module *cellGcmSys; -extern void cellGame_init(); -extern Module *cellGame; -extern void sys_io_init(); -extern Module *sys_io; +extern void cellGem_init(); +extern Module *cellGem; +extern void cellGifDec_init(); +extern Module *cellGifDec; +extern void cellJpgDec_init(); +extern Module *cellJpgDec; extern void cellL10n_init(); extern Module *cellL10n; +extern void cellNetCtl_init(); +extern Module *cellNetCtl; extern void cellPamf_init(); extern Module *cellPamf; +extern void cellPngDec_init(); +extern Module *cellPngDec; extern void cellResc_init(); extern void cellResc_load(); extern void cellResc_unload(); extern Module *cellResc; -extern void cellSail_init(); -extern Module *cellSail; extern void cellRtc_init(); extern Module *cellRtc; +extern void cellSail_init(); +extern Module *cellSail; extern void cellSpurs_init(); extern Module *cellSpurs; extern void cellSync_init(); extern Module *cellSync; extern void cellSysmodule_init(); extern Module *cellSysmodule; +extern void cellSysutil_init(); +extern Module *cellSysutil; +extern void cellSysutilAp_init(); +extern Module *cellSysutilAp; +extern void cellUserInfo_init(); +extern Module *cellUserInfo; extern void cellVdec_init(); extern Module *cellVdec; extern void cellVpost_init(); @@ -86,6 +84,10 @@ extern void sysPrxForUser_init(); extern Module *sysPrxForUser; extern void sys_fs_init(); extern Module *sys_fs; +extern void sys_io_init(); +extern Module *sys_io; +extern void sys_net_init(); +extern Module *sys_net; struct ModuleInfo { @@ -219,60 +221,70 @@ void ModuleManager::init() m_mod_init.emplace_back(0x0007, cellDmux_init); cellFont = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x0019, cellFont_init, cellFont_load, cellFont_unload); - sys_net = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back((u16)0x0000, sys_net_init); - sceNpTrophy = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0xf035, sceNpTrophy_init, nullptr, sceNpTrophy_unload); - sceNp = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0016, sceNp_init); - cellUserInfo = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0032, cellUserInfo_init); - cellSysutil = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0015, cellSysutil_init); - cellSysutilAp = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0039, cellSysutilAp_init); - cellPngDec = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0018, cellPngDec_init); - cellNetCtl = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0014, cellNetCtl_init); - cellJpgDec = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x000f, cellJpgDec_init); cellFontFT = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x001a, cellFontFT_init, cellFontFT_load, cellFontFT_unload); - cellGifDec = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0xf010, cellGifDec_init); - cellGcmSys = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0010, cellGcmSys_init, cellGcmSys_load, cellGcmSys_unload); cellGame = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x003e, cellGame_init); - sys_io = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back(0x0017, sys_io_init); + cellGcmSys = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0010, cellGcmSys_init, cellGcmSys_load, cellGcmSys_unload); + cellGem = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x005a, cellGem_init); + cellJpgDec = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x000f, cellJpgDec_init); + cellGifDec = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0xf010, cellGifDec_init); cellL10n = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x001e, cellL10n_init); + cellNetCtl = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0014, cellNetCtl_init); cellPamf = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x0012, cellPamf_init); - cellSail = static_cast (&(m_mod_init.back())) + 1; - m_mod_init.emplace_back("cellSail", cellSail_init); + cellPngDec = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0018, cellPngDec_init); cellResc = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x001f, cellResc_init, cellResc_load, cellResc_unload); cellRtc = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x0009, cellRtc_init); + cellSail = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back("cellSail", cellSail_init); cellSpurs = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x000a, cellSpurs_init); cellSync = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back("cellSync", cellSync_init); + cellSysutil = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0015, cellSysutil_init); + cellSysutilAp = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0039, cellSysutilAp_init); cellSysmodule = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back("cellSysmodule", cellSysmodule_init); + cellUserInfo = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0032, cellUserInfo_init); cellVdec = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x0005, cellVdec_init); cellVpost = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x0008, cellVpost_init); libmixer = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back("libmixer", libmixer_init); + sceNp = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0016, sceNp_init); + sceNpClans = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x003a, sceNpClans_init, nullptr, sceNpClans_unload); + sceNpCommerce2 = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0044, sceNpCommerce2_init, nullptr, sceNpCommerce2_unload); + sceNpSns = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0059, sceNpSns_init, nullptr, sceNpSns_unload); + sceNpTrophy = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0xf035, sceNpTrophy_init, nullptr, sceNpTrophy_unload); + sceNpTus = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0045, sceNpTus_init, nullptr, sceNpTus_unload); sysPrxForUser = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back("sysPrxForUser", sysPrxForUser_init); sys_fs = static_cast (&(m_mod_init.back())) + 1; m_mod_init.emplace_back(0x000e, sys_fs_init); + sys_io = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x0017, sys_io_init); + sys_net = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back((u16)0x0000, sys_net_init); initialized = true; } } diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index c10e46ff4a..1642691032 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -5,6 +5,7 @@ #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/RSX/GCM.h" +#include "Emu/SysCalls/lv2/sys_process.h" #include "sysPrxForUser.h" #include "cellGcmSys.h" @@ -37,6 +38,29 @@ gcmInfo gcm_info; u32 map_offset_addr = 0; u32 map_offset_pos = 0; +// Auxiliary functions + +/* + * Get usable local memory size for a specific game SDK version + * Example: For 0x00446000 (FW 4.46) we get a localSize of 0x0F900000 (249MB) + */ +u32 gcmGetLocalMemorySize(u32 sdk_version) +{ + if (sdk_version >= 0x00220000) { + return 0x0F900000; // 249MB + } + if (sdk_version >= 0x00200000) { + return 0x0F200000; // 242MB + } + if (sdk_version >= 0x00190000) { + return 0x0EA00000; // 234MB + } + if (sdk_version >= 0x00180000) { + return 0x0E800000; // 232MB + } + return 0x0E000000; // 224MB +} + //---------------------------------------------------------------------------- // Data Retrieval //---------------------------------------------------------------------------- @@ -267,16 +291,29 @@ u32 cellGcmGetTiledPitchSize(u32 size) return 0; } -int cellGcmInit(u32 context_addr, u32 cmdSize, u32 ioSize, u32 ioAddress) +void _cellGcmFunc1() { - cellGcmSys->Warning("cellGcmInit(context_addr=0x%x,cmdSize=0x%x,ioSize=0x%x,ioAddress=0x%x)", context_addr, cmdSize, ioSize, ioAddress); + cellGcmSys->Todo("_cellGcmFunc1()"); + return; +} + +void _cellGcmFunc15(mem_ptr_t context) +{ + cellGcmSys->Todo("_cellGcmFunc15(context_addr=0x%x)", context.GetAddr()); + return; +} + +// Called by cellGcmInit +s32 _cellGcmInitBody(mem_ptr_t context, u32 cmdSize, u32 ioSize, u32 ioAddress) +{ + cellGcmSys->Warning("_cellGcmInitBody(context_addr=0x%x, cmdSize=0x%x, ioSize=0x%x, ioAddress=0x%x)", context.GetAddr(), cmdSize, ioSize, ioAddress); if(!cellGcmSys->IsLoaded()) cellGcmSys->Load(); if(!local_size && !local_addr) { - local_size = 0xf900000; //TODO + local_size = 0xf900000; // TODO: Get sdk_version in _cellGcmFunc15 and pass it to gcmGetLocalMemorySize local_addr = Memory.RSXFBMem.GetStartAddr(); Memory.RSXFBMem.AllocAlign(local_size); } @@ -323,7 +360,7 @@ int cellGcmInit(u32 context_addr, u32 cmdSize, u32 ioSize, u32 ioAddress) gcm_info.control_addr = gcm_info.context_addr + 0x40; Memory.WriteData(gcm_info.context_addr, current_context); - Memory.Write32(context_addr, gcm_info.context_addr); + Memory.Write32(context.GetAddr(), gcm_info.context_addr); CellGcmControl& ctrl = (CellGcmControl&)Memory[gcm_info.control_addr]; ctrl.put = 0; @@ -331,8 +368,8 @@ int cellGcmInit(u32 context_addr, u32 cmdSize, u32 ioSize, u32 ioAddress) ctrl.ref = -1; auto& render = Emu.GetGSManager().GetRender(); - render.m_ctxt_addr = context_addr; - render.m_gcm_buffers_addr = Memory.Alloc(sizeof(gcmBuffer) * 8, sizeof(gcmBuffer)); + render.m_ctxt_addr = context.GetAddr(); + render.m_gcm_buffers_addr = Memory.Alloc(sizeof(CellGcmDisplayInfo) * 8, sizeof(CellGcmDisplayInfo)); render.m_zculls_addr = Memory.Alloc(sizeof(CellGcmZcullInfo) * 8, sizeof(CellGcmZcullInfo)); render.m_tiles_addr = Memory.Alloc(sizeof(CellGcmTileInfo) * 15, sizeof(CellGcmTileInfo)); render.m_gcm_buffers_count = 0; @@ -374,21 +411,19 @@ int cellGcmSetDisplayBuffer(u32 id, u32 offset, u32 pitch, u32 width, u32 height { cellGcmSys->Log("cellGcmSetDisplayBuffer(id=0x%x,offset=0x%x,pitch=%d,width=%d,height=%d)", id, offset, width ? pitch / width : pitch, width, height); - if (id > 7) - { + if (id > 7) { cellGcmSys->Error("cellGcmSetDisplayBuffer : CELL_EINVAL"); return CELL_EINVAL; } - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(Emu.GetGSManager().GetRender().m_gcm_buffers_addr); + CellGcmDisplayInfo* buffers = (CellGcmDisplayInfo*)Memory.GetMemFromAddr(Emu.GetGSManager().GetRender().m_gcm_buffers_addr); - buffers[id].offset = re(offset); - buffers[id].pitch = re(pitch); - buffers[id].width = re(width); - buffers[id].height = re(height); + buffers[id].offset = offset; + buffers[id].pitch = pitch; + buffers[id].width = width; + buffers[id].height = height; - if(id + 1 > Emu.GetGSManager().GetRender().m_gcm_buffers_count) - { + if (id + 1 > Emu.GetGSManager().GetRender().m_gcm_buffers_count) { Emu.GetGSManager().GetRender().m_gcm_buffers_count = id + 1; } @@ -1066,18 +1101,6 @@ int cellGcmSetFlipCommand(u32 ctx, u32 id) return cellGcmSetPrepareFlip(ctx, id); } -s64 cellGcmFunc15(u32 unk_addr) -{ - cellGcmSys->Todo("cellGcmFunc15(unk_addr=0x%x)", unk_addr); - - if (0/*TODO: If what?*/) { - _sys_memset(unk_addr, 0, 0x84); - } - - // TODO - return 0; -} - int cellGcmSetFlipCommandWithWaitLabel(u32 ctx, u32 id, u32 label_index, u32 label_value) { cellGcmSys->Log("cellGcmSetFlipCommandWithWaitLabel(ctx=0x%x, id=0x%x, label_index=0x%x, label_value=0x%x)", @@ -1196,7 +1219,9 @@ void cellGcmSys_init() cellGcmSys->AddFunc(0x23ae55a3, cellGcmGetLastSecondVTime); cellGcmSys->AddFunc(0x055bd74d, cellGcmGetTiledPitchSize); cellGcmSys->AddFunc(0x723bbc7e, cellGcmGetVBlankCount); - cellGcmSys->AddFunc(0x15bae46b, cellGcmInit); + cellGcmSys->AddFunc(0x5f909b17, _cellGcmFunc1); + cellGcmSys->AddFunc(0x3a33c1fd, _cellGcmFunc15); + cellGcmSys->AddFunc(0x15bae46b, _cellGcmInitBody); cellGcmSys->AddFunc(0xfce9e764, cellGcmInitSystemMode); cellGcmSys->AddFunc(0xb2e761d4, cellGcmResetFlipStatus); cellGcmSys->AddFunc(0x51c9d62b, cellGcmSetDebugOutputLevel); @@ -1258,7 +1283,6 @@ void cellGcmSys_init() // Other cellGcmSys->AddFunc(0x21397818, cellGcmSetFlipCommand); - cellGcmSys->AddFunc(0x3a33c1fd, cellGcmFunc15); cellGcmSys->AddFunc(0xd8f88e1a, cellGcmSetFlipCommandWithWaitLabel); cellGcmSys->AddFunc(0xd0b1d189, cellGcmSetTile); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.h b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.h index 610b177edc..0ae68c3451 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.h +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.h @@ -7,7 +7,7 @@ enum CELL_GCM_ERROR_INVALID_ENUM = 0x80210002, CELL_GCM_ERROR_INVALID_VALUE = 0x80210003, CELL_GCM_ERROR_INVALID_ALIGNMENT = 0x80210004, - CELL_GCM_ERROR_ADDRESS_OVERWRAP = 0x80210005 + CELL_GCM_ERROR_ADDRESS_OVERWRAP = 0x80210005, }; struct gcm_offset @@ -18,6 +18,8 @@ struct gcm_offset // Auxiliary functions void InitOffsetTable(); +u32 gcmGetLocalMemorySize(); + // SysCalls s32 cellGcmSetPrepareFlip(mem_ptr_t ctxt, u32 id); diff --git a/rpcs3/Emu/SysCalls/Modules/cellGem.cpp b/rpcs3/Emu/SysCalls/Modules/cellGem.cpp index 5133ce51c4..24b5897885 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGem.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGem.cpp @@ -1,26 +1,11 @@ #include "stdafx.h" -#if 0 +#include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/SysCalls.h" -#include "Emu/SysCalls/SC_FUNC.h" +#include "cellGem.h" void cellGem_init(); -Module cellGem(0x005a, cellGem_init); - -// Error Codes -enum -{ - CELL_GEM_ERROR_RESOURCE_ALLOCATION_FAILED = 0x80121801, - CELL_GEM_ERROR_ALREADY_INITIALIZED = 0x80121802, - CELL_GEM_ERROR_UNINITIALIZED = 0x80121803, - CELL_GEM_ERROR_INVALID_PARAMETER = 0x80121804, - CELL_GEM_ERROR_INVALID_ALIGNMENT = 0x80121805, - CELL_GEM_ERROR_UPDATE_NOT_FINISHED = 0x80121806, - CELL_GEM_ERROR_UPDATE_NOT_STARTED = 0x80121807, - CELL_GEM_ERROR_CONVERT_NOT_FINISHED = 0x80121808, - CELL_GEM_ERROR_CONVERT_NOT_STARTED = 0x80121809, - CELL_GEM_ERROR_WRITE_NOT_FINISHED = 0x8012180A, - CELL_GEM_ERROR_NOT_A_HUE = 0x8012180B, -}; +//Module cellGem(0x005a, cellGem_init); +Module *cellGem = nullptr; int cellGemCalibrate() { @@ -124,10 +109,16 @@ int cellGemGetInfo() return CELL_OK; } -int cellGemGetMemorySize() +// Should int be used, even when type is int_32t (s32)? +s32 cellGemGetMemorySize(be_t max_connect) { - UNIMPLEMENTED_FUNC(cellGem); - return CELL_OK; + cellGem->Warning("cellGemGetMemorySize(max_connect=%i)", max_connect); + + if (max_connect > CELL_GEM_MAX_NUM) + return CELL_GEM_ERROR_INVALID_PARAMETER; + + // Return in kilobytes, megabytes or something else? (currently kilobytes) + return max_connect * 4000; } int cellGemGetRGB() @@ -240,47 +231,46 @@ int cellGemWriteExternalPort() void cellGem_init() { - //cellGem.AddFunc(, cellGemAttributeInit); - cellGem.AddFunc(0xafa99ead, cellGemCalibrate); - cellGem.AddFunc(0x9b9714a4, cellGemClearStatusFlags); - cellGem.AddFunc(0x1a13d010, cellGemConvertVideoFinish); - cellGem.AddFunc(0x6dce048c, cellGemConvertVideoStart); - cellGem.AddFunc(0x4219de31, cellGemEnableCameraPitchAngleCorrection); - cellGem.AddFunc(0x1a2518a2, cellGemEnableMagnetometer); - cellGem.AddFunc(0xe1f85a80, cellGemEnd); - cellGem.AddFunc(0x6fc4c791, cellGemFilterState); - cellGem.AddFunc(0xce6d7791, cellGemForceRGB); - cellGem.AddFunc(0x6a5b7048, cellGemGetAccelerometerPositionInDevice); - cellGem.AddFunc(0x2d2c2764, cellGemGetAllTrackableHues); - cellGem.AddFunc(0x8befac67, cellGemGetCameraState); - cellGem.AddFunc(0x02eb41bb, cellGemGetEnvironmentLightingColor); - cellGem.AddFunc(0xb8ef56a6, cellGemGetHuePixels); - cellGem.AddFunc(0x92cc4b34, cellGemGetImageState); - cellGem.AddFunc(0xd37b127a, cellGemGetInertialState); - cellGem.AddFunc(0x9e1dff96, cellGemGetInfo); - cellGem.AddFunc(0x2e0a170d, cellGemGetMemorySize); - cellGem.AddFunc(0x1b30cc22, cellGemGetRGB); - cellGem.AddFunc(0x6db6b007, cellGemGetRumble); - cellGem.AddFunc(0x6441d38d, cellGemGetState); - cellGem.AddFunc(0xfee33481, cellGemGetStatusFlags); - cellGem.AddFunc(0x18ea899a, cellGemGetTrackerHue); - //cellGem.AddFunc(, cellGemGetVideoConvertSize); - cellGem.AddFunc(0xc7622586, cellGemHSVtoRGB); - cellGem.AddFunc(0x13ea7c64, cellGemInit); - cellGem.AddFunc(0xe3e4f0d6, cellGemInvalidateCalibration); - cellGem.AddFunc(0xfb5887f9, cellGemIsTrackableHue); - cellGem.AddFunc(0xa03ef587, cellGemPrepareCamera); - cellGem.AddFunc(0xc07896f9, cellGemPrepareVideoConvert); - //cellGem.AddFunc(, cellGemReadExternalPortDeviceInfo); - cellGem.AddFunc(0xde54e2fc, cellGemReset); - cellGem.AddFunc(0x49609306, cellGemSetRumble); - cellGem.AddFunc(0x77e08704, cellGemSetYaw); - cellGem.AddFunc(0x928ac5f8, cellGemTrackHues); - cellGem.AddFunc(0x41ae9c31, cellGemUpdateFinish); - cellGem.AddFunc(0x0ecd2261, cellGemUpdateStart); - //cellGem.AddFunc(, cellGemVideoConvertAttributeInit); - //cellGem.AddFunc(, cellGemVideoConvertAttributeInitRgba); - cellGem.AddFunc(0x1f6328d8, cellGemWriteExternalPort); + //cellGem->AddFunc(, cellGemAttributeInit); + cellGem->AddFunc(0xafa99ead, cellGemCalibrate); + cellGem->AddFunc(0x9b9714a4, cellGemClearStatusFlags); + cellGem->AddFunc(0x1a13d010, cellGemConvertVideoFinish); + cellGem->AddFunc(0x6dce048c, cellGemConvertVideoStart); + cellGem->AddFunc(0x4219de31, cellGemEnableCameraPitchAngleCorrection); + cellGem->AddFunc(0x1a2518a2, cellGemEnableMagnetometer); + cellGem->AddFunc(0xe1f85a80, cellGemEnd); + cellGem->AddFunc(0x6fc4c791, cellGemFilterState); + cellGem->AddFunc(0xce6d7791, cellGemForceRGB); + cellGem->AddFunc(0x6a5b7048, cellGemGetAccelerometerPositionInDevice); + cellGem->AddFunc(0x2d2c2764, cellGemGetAllTrackableHues); + cellGem->AddFunc(0x8befac67, cellGemGetCameraState); + cellGem->AddFunc(0x02eb41bb, cellGemGetEnvironmentLightingColor); + cellGem->AddFunc(0xb8ef56a6, cellGemGetHuePixels); + cellGem->AddFunc(0x92cc4b34, cellGemGetImageState); + cellGem->AddFunc(0xd37b127a, cellGemGetInertialState); + cellGem->AddFunc(0x9e1dff96, cellGemGetInfo); + cellGem->AddFunc(0x2e0a170d, cellGemGetMemorySize); + cellGem->AddFunc(0x1b30cc22, cellGemGetRGB); + cellGem->AddFunc(0x6db6b007, cellGemGetRumble); + cellGem->AddFunc(0x6441d38d, cellGemGetState); + cellGem->AddFunc(0xfee33481, cellGemGetStatusFlags); + cellGem->AddFunc(0x18ea899a, cellGemGetTrackerHue); + //cellGem->AddFunc(, cellGemGetVideoConvertSize); + cellGem->AddFunc(0xc7622586, cellGemHSVtoRGB); + cellGem->AddFunc(0x13ea7c64, cellGemInit); + cellGem->AddFunc(0xe3e4f0d6, cellGemInvalidateCalibration); + cellGem->AddFunc(0xfb5887f9, cellGemIsTrackableHue); + cellGem->AddFunc(0xa03ef587, cellGemPrepareCamera); + cellGem->AddFunc(0xc07896f9, cellGemPrepareVideoConvert); + //cellGem->AddFunc(, cellGemReadExternalPortDeviceInfo); + cellGem->AddFunc(0xde54e2fc, cellGemReset); + cellGem->AddFunc(0x49609306, cellGemSetRumble); + cellGem->AddFunc(0x77e08704, cellGemSetYaw); + cellGem->AddFunc(0x928ac5f8, cellGemTrackHues); + cellGem->AddFunc(0x41ae9c31, cellGemUpdateFinish); + cellGem->AddFunc(0x0ecd2261, cellGemUpdateStart); + //cellGem->AddFunc(, cellGemVideoConvertAttributeInit); + //cellGem->AddFunc(, cellGemVideoConvertAttributeInitRgba); + cellGem->AddFunc(0x1f6328d8, cellGemWriteExternalPort); } -#endif diff --git a/rpcs3/Emu/SysCalls/Modules/cellGem.h b/rpcs3/Emu/SysCalls/Modules/cellGem.h new file mode 100644 index 0000000000..f94ea35112 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellGem.h @@ -0,0 +1,190 @@ +#pragma once + +#include "cellSpurs.h" + +// Had to use define, since enum doesn't allow floats +#define CELL_GEM_SPHERE_RADIUS_MM = 22.5f; + +// Error Codes +enum +{ + CELL_GEM_ERROR_RESOURCE_ALLOCATION_FAILED = 0x80121801, + CELL_GEM_ERROR_ALREADY_INITIALIZED = 0x80121802, + CELL_GEM_ERROR_UNINITIALIZED = 0x80121803, + CELL_GEM_ERROR_INVALID_PARAMETER = 0x80121804, + CELL_GEM_ERROR_INVALID_ALIGNMENT = 0x80121805, + CELL_GEM_ERROR_UPDATE_NOT_FINISHED = 0x80121806, + CELL_GEM_ERROR_UPDATE_NOT_STARTED = 0x80121807, + CELL_GEM_ERROR_CONVERT_NOT_FINISHED = 0x80121808, + CELL_GEM_ERROR_CONVERT_NOT_STARTED = 0x80121809, + CELL_GEM_ERROR_WRITE_NOT_FINISHED = 0x8012180A, + CELL_GEM_ERROR_NOT_A_HUE = 0x8012180B, +}; + +// Runtime statuses +enum +{ + CELL_GEM_NOT_CONNECTED = 1, + CELL_GEM_SPHERE_NOT_CALIBRATED = 2, + CELL_GEM_SPHERE_CALIBRATING = 3, + CELL_GEM_COMPUTING_AVAILABLE_COLORS = 4, + CELL_GEM_HUE_NOT_SET = 5, + CELL_GEM_NO_VIDEO = 6, + CELL_GEM_TIME_OUT_OF_RANGE = 7, + CELL_GEM_NOT_CALIBRATED = 8, + CELL_GEM_NO_EXTERNAL_PORT_DEVICE = 9, +}; + +// General constents +enum +{ + CELL_GEM_CTRL_CIRCLE = 1 << 5, + CELL_GEM_CTRL_CROSS = 1 << 6, + CELL_GEM_CTRL_MOVE = 1 << 2, + CELL_GEM_CTRL_SELECT = 1 << 0, + CELL_GEM_CTRL_SQUARE = 1 << 7, + CELL_GEM_CTRL_START = 1 << 3, + CELL_GEM_CTRL_T = 1 << 1, + CELL_GEM_CTRL_TRIANGLE = 1 << 4, + CELL_GEM_DONT_CARE_HUE = 4 << 24, + CELL_GEM_DONT_CHANGE_HUE = 8 << 24, + CELL_GEM_DONT_TRACK_HUE = 2 << 24, + CELL_GEM_EXT_CONNECTED = 1 << 0, + CELL_GEM_EXT_EXT0 = 1 << 1, + CELL_GEM_EXT_EXT1 = 1 << 2, + CELL_GEM_EXTERNAL_PORT_DEVICE_INFO_SIZE = 38, + CELL_GEM_EXTERNAL_PORT_OUTPUT_SIZE = 40, + CELL_GEM_FLAG_CALIBRATION_FAILED_BRIGHT_LIGHTING = 1 << 4, + CELL_GEM_FLAG_CALIBRATION_FAILED_CANT_FIND_SPHERE = 1 << 2, + CELL_GEM_FLAG_CALIBRATION_FAILED_MOTION_DETECTED = 1 << 3, + CELL_GEM_FLAG_CALIBRATION_OCCURRED = 1 << 0, + CELL_GEM_FLAG_CALIBRATION_SUCCEEDED = 1 << 1, + CELL_GEM_FLAG_CALIBRATION_WARNING_BRIGHT_LIGHTING = 1 << 6, + ELL_GEM_FLAG_CALIBRATION_WARNING_MOTION_DETECTED = 1 << 5, + CELL_GEM_FLAG_CAMERA_PITCH_ANGLE_CHANGED = 1 << 9, + CELL_GEM_FLAG_CURRENT_HUE_CONFLICTS_WITH_ENVIRONMENT = 1 << 13, + CELL_GEM_FLAG_LIGHTING_CHANGED = 1 << 7, + CELL_GEM_FLAG_VARIABLE_MAGNETIC_FIELD = 1 << 10, + CELL_GEM_FLAG_VERY_COLORFUL_ENVIRONMENT = 1 << 12, + CELL_GEM_FLAG_WEAK_MAGNETIC_FIELD = 1 << 11, + CELL_GEM_FLAG_WRONG_FIELD_OF_VIEW_SETTING = 1 << 8, + CELL_GEM_INERTIAL_STATE_FLAG_LATEST = 0, + CELL_GEM_INERTIAL_STATE_FLAG_NEXT = 2, + CELL_GEM_INERTIAL_STATE_FLAG_PREVIOUS = 1, + CELL_GEM_LATENCY_OFFSET = -22000, + CELL_GEM_MAX_CAMERA_EXPOSURE = 511, + CELL_GEM_MAX_NUM = 4, + CELL_GEM_MIN_CAMERA_EXPOSURE = 40, + CELL_GEM_STATE_FLAG_CURRENT_TIME = 0, + CELL_GEM_STATE_FLAG_LATEST_IMAGE_TIME = 1, + CELL_GEM_STATE_FLAG_TIMESTAMP = 2, + CELL_GEM_STATUS_DISCONNECTED = 0, + CELL_GEM_STATUS_READY = 1, + CELL_GEM_TRACKING_FLAG_POSITION_TRACKED = 1 << 0, + CELL_GEM_TRACKING_FLAG_VISIBLE = 1 << 1, + CELL_GEM_VERSION = 2, +}; + +struct CellGemAttribute +{ + be_t version; + be_t max_connect; + be_t memory_ptr; + CellSpurs spurs; + u8 spu_priorities[8]; +}; + +struct CellGemCameraState +{ + be_t exposure; + float exposure_time; + float gain; + float pitch_angle; + float pitch_angle_estimate; +}; + +struct CellGemExtPortData +{ + be_t status; + be_t digital1; + be_t digital2; + be_t analog_right_x; + be_t analog_right_y; + be_t analog_left_x; + be_t analog_left_y; + u8 custom[5]; +}; + +struct CellGemImageState +{ + //system_time_t frame_timestamp; // TODO: Figure what to use for them + //system_time_t timestamp; + float u; + float v; + float r; + float projectionx; + float projectiony; + float distance; + u8 visible; + u8 r_valid; +}; + +struct CellGemPadData +{ + be_t digitalbuttons; + be_t analog_T; +}; + +struct CellGemInertialState +{ + //vec_float4 accelerometer; // TODO: Figure what to use as replacement for vec_float4 + //vec_float4 gyro; + //vec_float4 accelerometer_bias; + //vec_float4 gyro_bias; + CellGemPadData pad; + CellGemExtPortData ext; + //system_time_t timestamp; + be_t counter; + float temperature; +}; + +struct CellGemInfo +{ + be_t max_connect; + be_t now_connect; + be_t status[CELL_GEM_MAX_NUM]; + be_t port[CELL_GEM_MAX_NUM]; +}; + +struct CellGemState +{ + //vec_float4 pos; + //vec_float4 vel; + //vec_float4 accel; + //vec_float4 quat; + //vec_float4 angvel; + //vec_float4 angaccel; + //vec_float4 handle_pos; + //vec_float4 handle_vel; + //vec_float4 handle_accel; + CellGemPadData pad; + CellGemExtPortData ext; + //system_time_t timestamp; + float temperature; + float camera_pitch_angle; + be_t tracking_flags; +}; + +struct CellGemVideoConvertAttribute +{ + be_t version; + be_t output_format; + be_t conversion_flags; + float gain; + float red_gain; + float green_gain; + float blue_gain; + be_t buffer_memory; + be_t video_data_out; + u8 alpha; +}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp index 1a70d38543..704570a99c 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp @@ -3,39 +3,22 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/Modules.h" +#include "cellL10n.h" +#include +#include -// Requires GCC 4.10 apparently.. #ifdef _MSC_VER +#include +#include #include +#else +#include #endif //void cellL10n_init(); //Module cellL10n(0x001e, cellL10n_init); Module *cellL10n = nullptr; - -// L10nResult -enum -{ - ConversionOK, - SRCIllegal, - DSTExhausted, - ConverterUnknown, -}; - -// detection result -enum -{ - L10N_STR_UNKNOWN = (1 << 0), - L10N_STR_ASCII = (1 << 1), - L10N_STR_JIS = (1 << 2), - L10N_STR_EUCJP = (1 << 3), - L10N_STR_SJIS = (1 << 4), - L10N_STR_UTF8 = (1 << 5), - L10N_STR_ILLEGAL = (1 << 16), - L10N_STR_ERROR = (1 << 17), -}; - int UTF16stoUTF8s(mem16_ptr_t utf16, mem64_t utf16_len, mem8_ptr_t utf8, mem64_t utf8_len) { cellL10n->Warning("UTF16stoUTF8s(utf16_addr=0x%x, utf16_len_addr=0x%x, utf8_addr=0x%x, utf8_len_addr=0x%x)", @@ -66,6 +49,289 @@ int jstrchk(mem8_ptr_t jstr) return L10N_STR_UTF8; } +//translate code id to code name. some codepage may has another name. +//If this makes your compilation fail, try replace the string code with one in "iconv -l" +bool _L10nCodeParse(int code, std::string& retCode) +{ + if ((code >= _L10N_CODE_) || (code < 0)) return false; + switch (code) + { + //I don't know these Unicode Variants is LB or BE. + case L10N_UTF8: retCode = "UTF-8"; return true; + case L10N_UTF16: retCode = "UTF-16"; return true; + case L10N_UTF32: retCode = "UTF-32"; return true; + case L10N_UCS2: retCode = "UCS-2"; return true; + case L10N_UCS4: retCode = "UCS-4"; return true; + case L10N_ISO_8859_1: retCode = "ISO-8859-1"; return true; + case L10N_ISO_8859_2: retCode = "ISO-8859-2"; return true; + case L10N_ISO_8859_3: retCode = "ISO-8859-3"; return true; + case L10N_ISO_8859_4: retCode = "ISO-8859-4"; return true; + case L10N_ISO_8859_5: retCode = "ISO-8859-5"; return true; + case L10N_ISO_8859_6: retCode = "ISO-8859-6"; return true; + case L10N_ISO_8859_7: retCode = "ISO-8859-7"; return true; + case L10N_ISO_8859_8: retCode = "ISO-8859-8"; return true; + case L10N_ISO_8859_9: retCode = "ISO-8859-9"; return true; + case L10N_ISO_8859_10: retCode = "ISO-8859-10"; return true; + case L10N_ISO_8859_11: retCode = "ISO-8859-11"; return true; + case L10N_ISO_8859_13: retCode = "ISO-8859-13"; return true; //No ISO-8859-12 ha ha. + case L10N_ISO_8859_14: retCode = "ISO-8859-14"; return true; + case L10N_ISO_8859_15: retCode = "ISO-8859-15"; return true; + case L10N_ISO_8859_16: retCode = "ISO-8859-16"; return true; + case L10N_CODEPAGE_437: retCode = "CP437"; return true; + case L10N_CODEPAGE_850: retCode = "CP850"; return true; + case L10N_CODEPAGE_863: retCode = "CP863"; return true; + case L10N_CODEPAGE_866: retCode = "CP866"; return true; + case L10N_CODEPAGE_932: retCode = "CP932"; return true; + case L10N_CODEPAGE_936: retCode = "CP936"; return true; + case L10N_CODEPAGE_949: retCode = "CP949"; return true; + case L10N_CODEPAGE_950: retCode = "CP950"; return true; + case L10N_CODEPAGE_1251:retCode = "CP1251"; return true; //CYRL + case L10N_CODEPAGE_1252:retCode = "CP1252"; return true; //ANSI + case L10N_EUC_CN: retCode = "EUC-CN"; return true; //GB2312 + case L10N_EUC_JP: retCode = "EUC-JP"; return true; + case L10N_EUC_KR: retCode = "EUC-KR"; return true; + case L10N_ISO_2022_JP: retCode = "ISO-2022-JP"; return true; + case L10N_ARIB: retCode = "ARABIC"; return true; //TODO: think that should be ARABIC. + case L10N_HZ: retCode = "HZ"; return true; + case L10N_GB18030: retCode = "GB18030"; return true; + case L10N_RIS_506: retCode = "SHIFT-JIS"; return true; //MusicShiftJIS, MS_KANJI + //These are only supported with FW 3.10 and above + case L10N_CODEPAGE_852: retCode = "CP852"; return true; + case L10N_CODEPAGE_1250:retCode = "CP1250"; return true; //EE + case L10N_CODEPAGE_737: retCode = "CP737"; return true; + case L10N_CODEPAGE_1253:retCode = "CP1253"; return true; //Greek + case L10N_CODEPAGE_857: retCode = "CP857"; return true; + case L10N_CODEPAGE_1254:retCode = "CP1254"; return true; //Turk + case L10N_CODEPAGE_775: retCode = "CP775"; return true; + case L10N_CODEPAGE_1257:retCode = "CP1257"; return true; //WINBALTRIM + case L10N_CODEPAGE_855: retCode = "CP855"; return true; + case L10N_CODEPAGE_858: retCode = "CP858"; return true; + case L10N_CODEPAGE_860: retCode = "CP860"; return true; + case L10N_CODEPAGE_861: retCode = "CP861"; return true; + case L10N_CODEPAGE_865: retCode = "CP865"; return true; + case L10N_CODEPAGE_869: retCode = "CP869"; return true; + default: return false; + } +} + +//translate code id to code name. +//If this makes your compilation fail, try replace the string code with one in "iconv -l" +bool _L10nCodeParse(int code, unsigned int & retCode) +{ + retCode = 0; + if ((code >= _L10N_CODE_) || (code < 0)) return false; + switch (code) + { + case L10N_UTF8: retCode = 65001; return false; + case L10N_UTF16: retCode = 1200; return false; //1200=LE,1201=BE + case L10N_UTF32: retCode = 12000; return false; //12000=LE,12001=BE + case L10N_UCS2: retCode = 1200; return false; //Not in OEM, but just the same as UTF16 + case L10N_UCS4: retCode = 12000; return false; //Not in OEM, but just the same as UTF32 + //All OEM Code Pages are Multi-Byte, not wchar_t,u16,u32. + case L10N_ISO_8859_1: retCode = 28591; return true; + case L10N_ISO_8859_2: retCode = 28592; return true; + case L10N_ISO_8859_3: retCode = 28593; return true; + case L10N_ISO_8859_4: retCode = 28594; return true; + case L10N_ISO_8859_5: retCode = 28595; return true; + case L10N_ISO_8859_6: retCode = 28596; return true; + case L10N_ISO_8859_7: retCode = 28597; return true; + case L10N_ISO_8859_8: retCode = 28598; return true; + case L10N_ISO_8859_9: retCode = 28599; return true; + case L10N_ISO_8859_10: retCode = 28600; return true; + case L10N_ISO_8859_11: retCode = 28601; return true; + case L10N_ISO_8859_13: retCode = 28603; return true; //No ISO-8859-12 ha ha. + case L10N_ISO_8859_14: retCode = 28604; return true; + case L10N_ISO_8859_15: retCode = 28605; return true; + case L10N_ISO_8859_16: retCode = 28606; return true; + case L10N_CODEPAGE_437: retCode = 437; return true; + case L10N_CODEPAGE_850: retCode = 850; return true; + case L10N_CODEPAGE_863: retCode = 863; return true; + case L10N_CODEPAGE_866: retCode = 866; return true; + case L10N_CODEPAGE_932: retCode = 932; return true; + case L10N_CODEPAGE_936: retCode = 936; return true; + case L10N_CODEPAGE_949: retCode = 949; return true; + case L10N_CODEPAGE_950: retCode = 950; return true; + case L10N_CODEPAGE_1251:retCode = 1251; return true; //CYRL + case L10N_CODEPAGE_1252:retCode = 1252; return true; //ANSI + case L10N_EUC_CN: retCode = 51936; return true; //GB2312 + case L10N_EUC_JP: retCode = 51932; return true; + case L10N_EUC_KR: retCode = 51949; return true; + case L10N_ISO_2022_JP: retCode = 50222; return true; + //Maybe 708/720/864/1256/10004/20420/28596/ + case L10N_ARIB: retCode = 20420; return true; //TODO: think that should be ARABIC. + case L10N_HZ: retCode = 52936; return true; + case L10N_GB18030: retCode = 54936; return true; + case L10N_RIS_506: retCode = 932; return true; //MusicShiftJIS, MS_KANJI, TODO: Code page + //These are only supported with FW 3.10 and above + case L10N_CODEPAGE_852: retCode = 852; return true; + case L10N_CODEPAGE_1250:retCode = 1250; return true; //EE + case L10N_CODEPAGE_737: retCode = 737; return true; + case L10N_CODEPAGE_1253:retCode = 1253; return true; //Greek + case L10N_CODEPAGE_857: retCode = 857; return true; + case L10N_CODEPAGE_1254:retCode = 1254; return true; //Turk + case L10N_CODEPAGE_775: retCode = 775; return true; + case L10N_CODEPAGE_1257:retCode = 1257; return true; //WINBALTRIM + case L10N_CODEPAGE_855: retCode = 855; return true; + case L10N_CODEPAGE_858: retCode = 858; return true; + case L10N_CODEPAGE_860: retCode = 860; return true; + case L10N_CODEPAGE_861: retCode = 861; return true; + case L10N_CODEPAGE_865: retCode = 865; return true; + case L10N_CODEPAGE_869: retCode = 869; return true; + default: return false; + } +} + +//TODO: check and complete transforms. note: unicode to/from other Unicode Formats is needed. +#ifdef _MSC_VER + +//Use code page to transform std::string to std::wstring. +int _OEM2Wide(unsigned int oem_code, const std::string src, std::wstring& dst) +{ + //Such length returned should include the '\0' character. + int length = MultiByteToWideChar(oem_code, 0, src.c_str(), -1, NULL, 0); + wchar_t *store = new wchar_t[length]; + memset(store, 0, (length)*sizeof(wchar_t)); + MultiByteToWideChar(oem_code, 0, src.c_str(), -1, (LPWSTR)store, length); + std::wstring result(store); + dst = result; + delete store; store = NULL; + return length - 1; +} + +//Use Code page to transform std::wstring to std::string. +int _Wide2OEM(unsigned int oem_code, const std::wstring src, std::string& dst) +{ + //Such length returned should include the '\0' character. + int length = WideCharToMultiByte(oem_code, 0, src.c_str(), -1, NULL, 0, NULL, NULL); + char *store = new char[length]; + memset(store, 0, (length)*sizeof(char)); + WideCharToMultiByte(oem_code, 0, src.c_str(), -1, store, length, NULL, NULL); + std::string result(store); + dst = result; + delete store; store = NULL; + return length - 1; +} + +//Convert Codepage to Codepage (all char*) +std::string _OemToOem(unsigned int src_code, unsigned int dst_code, const std::string str) +{ + std::wstring wide; std::string result; + _OEM2Wide(src_code, str, wide); + _Wide2OEM(dst_code, wide, result); + return result; +} + +/* +//Original piece of code. and this is for windows using with _OEM2Wide,_Wide2OEM,_OemToOem. +//The Char -> Char Execution of this function has already been tested using VS and CJK text with encoding. +int _L10nConvertStr(int src_code, const void *src, size_t * src_len, int dst_code, void *dst, size_t * dst_len) +{ + unsigned int srcCode = 0, dstCode = 0; //OEM code pages + bool src_page_converted = _L10nCodeParse(src_code, srcCode); //Check if code is in list. + bool dst_page_converted = _L10nCodeParse(dst_code, dstCode); + + if (((!src_page_converted) && (srcCode == 0)) + || ((!dst_page_converted) && (dstCode == 0))) + return ConverterUnknown; + + if (strnlen_s((char*)src, *src_len) != *src_len) return SRCIllegal; + //std::string wrapped_source = (char*)Memory.VirtualToRealAddr(src.GetAddr()); + std::string wrapped_source((char*)src); + //if (wrapped_source.length != src_len.GetValue()) return SRCIllegal; + std::string target = _OemToOem(srcCode, dstCode, wrapped_source); + + if (target.length() > *dst_len) return DSTExhausted; + + Memory.WriteString(dst, target.c_str()); + + return ConversionOK; +} +//This is the one used with iconv library for linux/mac. Also char->char. +//I've tested the code with console apps using codeblocks. +int _L10nConvertStr(int src_code, const void* src, size_t * src_len, int dst_code, void * dst, size_t * dst_len) +{ + std::string srcCode, dstCode; + int retValue = ConversionOK; + if ((_L10nCodeParse(src_code, srcCode)) && (_L10nCodeParse(dst_code, dstCode))) + { + iconv_t ict = iconv_open(srcCode.c_str(), dstCode.c_str()); + //char *srcBuf = (char*)Memory.VirtualToRealAddr(src.GetAddr()); + //char *dstBuf = (char*)Memory.VirtualToRealAddr(dst.GetAddr()); + char *srcBuf = (char*)src, *dstBuf = (char*)dst; + size_t srcLen = *src_len, dstLen = *dst_len; + size_t ictd = iconv(ict, &srcBuf, &srcLen, &dstBuf, &dstLen); + if (ictd != *src_len) + { + if (errno == EILSEQ) + retValue = SRCIllegal; //Invalid multi-byte sequence + else if (errno == E2BIG) + retValue = DSTExhausted;//Not enough space + else if (errno == EINVAL) + retValue = SRCIllegal; + } + iconv_close(ict); + //retValue = ConversionOK; + } + else retValue = ConverterUnknown; + return retValue; +}*/ +#endif + +//TODO: Check the code in emulation. If support for UTF8/UTF16/UTF32/UCS2/UCS4 should use wider chars.. awful. +int L10nConvertStr(int src_code, mem8_ptr_t src, mem64_t src_len, int dst_code, mem8_ptr_t dst, mem64_t dst_len) +{ + LOG_ERROR(HLE, "L10nConvertStr(src_code=%d,src=0x%x,src_len=%ld,dst_code=%d,dst=0x%x,dst_len=%ld)", + src_code, src.GetAddr(), src_len.GetValue(), dst_code, dst.GetAddr(), dst_len.GetValue()); + LOG_ERROR(HLE, "L10nConvertStr: 1st char at dst: %x(Hex)", *((char*)Memory.VirtualToRealAddr(src.GetAddr()))); +#ifdef _MSC_VER + unsigned int srcCode = 0, dstCode = 0; //OEM code pages + bool src_page_converted = _L10nCodeParse(src_code, srcCode); //Check if code is in list. + bool dst_page_converted = _L10nCodeParse(dst_code, dstCode); + + if (((!src_page_converted) && (srcCode == 0)) + || ((!dst_page_converted) && (dstCode == 0))) + return ConverterUnknown; + + //if (strnlen_s((char*)src, *src_len) != *src_len) return SRCIllegal; + std::string wrapped_source = (char*)Memory.VirtualToRealAddr(src.GetAddr()); + //std::string wrapped_source((char*)src); + if (wrapped_source.length() != src_len.GetValue()) return SRCIllegal; + std::string target = _OemToOem(srcCode, dstCode, wrapped_source); + + if (target.length() > dst_len.GetValue()) return DSTExhausted; + + Memory.WriteString(dst, target.c_str()); + + return ConversionOK; +#else + std::string srcCode, dstCode; + int retValue = ConversionOK; + if ((_L10nCodeParse(src_code, srcCode)) && (_L10nCodeParse(dst_code, dstCode))) + { + iconv_t ict = iconv_open(srcCode.c_str(), dstCode.c_str()); + char *srcBuf = (char*)Memory.VirtualToRealAddr(src.GetAddr()); + char *dstBuf = (char*)Memory.VirtualToRealAddr(dst.GetAddr()); + //char *srcBuf = (char*)src, *dstBuf = (char*)dst; + //size_t srcLen = *src_len, dstLen = *dst_len; + size_t srcLen = src_len.GetValue(), dstLen = dst_len.GetValue(); + size_t ictd = iconv(ict, &srcBuf, &srcLen, &dstBuf, &dstLen); + if (ictd != src_len.GetValue())//if (ictd != *src_len) + { + if (errno == EILSEQ) + retValue = SRCIllegal; //Invalid multi-byte sequence + else if (errno == E2BIG) + retValue = DSTExhausted;//Not enough space + else if (errno == EINVAL) + retValue = SRCIllegal; + } + iconv_close(ict); + //retValue = ConversionOK; + } + else retValue = ConverterUnknown; + return retValue; +#endif +} + void cellL10n_init() { // NOTE: I think this module should be LLE'd instead of implementing all its functions @@ -171,7 +437,7 @@ void cellL10n_init() // cellL10n->AddFunc(0x8f472054, UTF8stoEUCCNs); // cellL10n->AddFunc(0x90e9b5d2, EUCJPstoUCS2s); // cellL10n->AddFunc(0x91a99765, UHCtoUCS2); - // cellL10n->AddFunc(0x931ff25a, L10nConvertStr); + cellL10n->AddFunc(0x931ff25a, L10nConvertStr); // cellL10n->AddFunc(0x949bb14c, GBKstoUTF8s); // cellL10n->AddFunc(0x9557ac9b, UTF8toUHC); // cellL10n->AddFunc(0x9768b6d3, UTF32toUTF8); @@ -221,7 +487,7 @@ void cellL10n_init() // cellL10n->AddFunc(0xdefa1c17, UTF8stoHZs); // cellL10n->AddFunc(0xe2eabb32, eucjp2kuten); // cellL10n->AddFunc(0xe6d9e234, UTF8toBIG5); - cellL10n->AddFunc(0xe6f5711b, UTF16stoUTF8s); + // cellL10n->AddFunc(0xe6f5711b, UTF16stoUTF8s); // cellL10n->AddFunc(0xe956dc64, JISstoUCS2s); // cellL10n->AddFunc(0xeabc3d00, GB18030toUTF8); // cellL10n->AddFunc(0xeb3dc670, UTF8toSJIS); diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.h b/rpcs3/Emu/SysCalls/Modules/cellL10n.h new file mode 100644 index 0000000000..512d2a4bcf --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.h @@ -0,0 +1,86 @@ +#include "stdafx.h" + +// Requires GCC 4.10 apparently.. +#ifdef _MSC_VER +#include +#endif + +// L10nResult +enum +{ + ConversionOK, + SRCIllegal, + DSTExhausted, + ConverterUnknown, +}; + +// detection result +enum +{ + L10N_STR_UNKNOWN = (1 << 0), + L10N_STR_ASCII = (1 << 1), + L10N_STR_JIS = (1 << 2), + L10N_STR_EUCJP = (1 << 3), + L10N_STR_SJIS = (1 << 4), + L10N_STR_UTF8 = (1 << 5), + L10N_STR_ILLEGAL = (1 << 16), + L10N_STR_ERROR = (1 << 17), +}; + +//CodePages +enum { + L10N_UTF8 = 0, + L10N_UTF16, + L10N_UTF32, + L10N_UCS2, + L10N_UCS4, + L10N_ISO_8859_1, + L10N_ISO_8859_2, + L10N_ISO_8859_3, + L10N_ISO_8859_4, + L10N_ISO_8859_5, + L10N_ISO_8859_6, + L10N_ISO_8859_7, + L10N_ISO_8859_8, + L10N_ISO_8859_9, + L10N_ISO_8859_10, + L10N_ISO_8859_11, + L10N_ISO_8859_13, + L10N_ISO_8859_14, + L10N_ISO_8859_15, + L10N_ISO_8859_16, + L10N_CODEPAGE_437, + L10N_CODEPAGE_850, + L10N_CODEPAGE_863, + L10N_CODEPAGE_866, + L10N_CODEPAGE_932, + L10N_CODEPAGE_936, + L10N_CODEPAGE_949, + L10N_CODEPAGE_950, + L10N_CODEPAGE_1251, + L10N_CODEPAGE_1252, + L10N_EUC_CN, + L10N_EUC_JP, + L10N_EUC_KR, + L10N_ISO_2022_JP, + L10N_ARIB, + L10N_HZ, + L10N_GB18030, + L10N_RIS_506, + //FW 3.10 and above + L10N_CODEPAGE_852, + L10N_CODEPAGE_1250, + L10N_CODEPAGE_737, + L10N_CODEPAGE_1253, + L10N_CODEPAGE_857, + L10N_CODEPAGE_1254, + L10N_CODEPAGE_775, + L10N_CODEPAGE_1257, + L10N_CODEPAGE_855, + L10N_CODEPAGE_858, + L10N_CODEPAGE_860, + L10N_CODEPAGE_861, + L10N_CODEPAGE_865, + L10N_CODEPAGE_869, + _L10N_CODE_ +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index eccd0861e2..3809643ad6 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -904,10 +904,10 @@ int cellRescGcmSurface2RescSrc(mem_ptr_t gcmSurface, mem_ptr_tformat = textureFormat; - rescSrc->pitch = re(gcmSurface->colorPitch[0]); - rescSrc->width = re(gcmSurface->width) * xW; - rescSrc->height = re(gcmSurface->height) * xH; - rescSrc->offset = re(gcmSurface->colorOffset[0]); + rescSrc->pitch = gcmSurface->colorPitch[0]; + rescSrc->width = gcmSurface->width * xW; + rescSrc->height = gcmSurface->height * xH; + rescSrc->offset = gcmSurface->colorOffset[0]; return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index d71ee19a14..a4f5b9b295 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -33,8 +33,8 @@ struct sceNpTrophyInternalContext std::unique_ptr tropusr; -//TODO: remove the following code when Visual C++ no longer generates -//compiler errors for it. All of this should be auto-generated +// TODO: remove the following code when Visual C++ no longer generates +// compiler errors for it. All of this should be auto-generated #if defined(_MSC_VER) && _MSC_VER <= 1800 sceNpTrophyInternalContext() : trp_stream(), diff --git a/rpcs3/Emu/SysCalls/SysCalls.cpp b/rpcs3/Emu/SysCalls/SysCalls.cpp index b55287ee8c..024f39cea6 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.cpp +++ b/rpcs3/Emu/SysCalls/SysCalls.cpp @@ -920,7 +920,7 @@ void default_syscall() void SysCalls::DoSyscall(u32 code) { - //Auto-Pause using simple singleton. + //Auto Pause using simple singleton. Debug::AutoPause::getInstance().TryPause(code); if(code < 1024) diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp index 5d92f4205c..1b65fdd5ea 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp @@ -19,27 +19,57 @@ s32 sys_rsx_device_close() return CELL_OK; } -s32 sys_rsx_memory_allocate() +/* + * lv2 SysCall 668 (0x29C): sys_rsx_memory_allocate + * @param mem_handle (OUT): Context / ID, which is used by sys_rsx_memory_free to free allocated memory. + * @param mem_addr (OUT): Returns the local memory base address, usually 0xC0000000. + * @param size (IN): Local memory size. E.g. 0x0F900000 (249 MB). + * @param flags (IN): E.g. Immediate value passed in cellGcmSys is 8. + * @param a5 (IN): E.g. Immediate value passed in cellGcmSys is 0x00300000 (3 MB?). + * @param a6 (IN): E.g. Immediate value passed in cellGcmSys is 16. + * @param a7 (IN): E.g. Immediate value passed in cellGcmSys is 8. + */ +s32 sys_rsx_memory_allocate(mem32_t mem_handle, mem32_t mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7) { - sys_rsx.Todo("sys_rsx_memory_allocate()"); + sys_rsx.Todo("sys_rsx_memory_allocate(mem_handle_addr=0x%x, local_mem_addr=0x%x, size=0x%x, flags=0x%x, a5=%d, a6=%d, a7=%d)", + mem_handle.GetAddr(), mem_addr.GetAddr(), size, flags, a5, a6, a7); return CELL_OK; } -s32 sys_rsx_memory_free() +/* + * lv2 SysCall 669 (0x29D): sys_rsx_memory_free + * @param mem_handle (OUT): Context / ID, for allocated local memory generated by sys_rsx_memory_allocate + */ +s32 sys_rsx_memory_free(u32 mem_handle) { - sys_rsx.Todo("sys_rsx_memory_free()"); + sys_rsx.Todo("sys_rsx_memory_free(mem_handle=%d)", mem_handle); return CELL_OK; } -s32 sys_rsx_context_allocate() +/* + * lv2 SysCall 670 (0x29E): sys_rsx_context_allocate + * @param context_id (OUT): RSX_context, E.g. 0x55555555 (in vsh.self) + * @param lpar_dma_control (OUT): Control register area. E.g. 0x60100000 (in vsh.self) + * @param lpar_driver_info (OUT): RSX data like frequencies, sizes, version... E.g. 0x60200000 (in vsh.self) + * @param lpar_reports (OUT): Report data area. E.g. 0x60300000 (in vsh.self) + * @param mem_ctx (IN): mem_ctx given by sys_rsx_memory_allocate + * @param system_mode (IN): + */ +s32 sys_rsx_context_allocate(mem32_t context_id, mem32_t lpar_dma_control, mem32_t lpar_driver_info, mem32_t lpar_reports, u64 mem_ctx, u64 system_mode) { - sys_rsx.Todo("sys_rsx_context_allocate()"); + sys_rsx.Todo("sys_rsx_context_allocate(context_id_addr=0x%x, lpar_dma_control_addr=0x%x, lpar_driver_info_addr=0x%x, lpar_reports_addr=0x%x, mem_ctx=0x%x, system_mode=0x%x)", + context_id.GetAddr(), lpar_dma_control.GetAddr(), lpar_driver_info.GetAddr(), lpar_reports.GetAddr(), mem_ctx, system_mode); + return CELL_OK; } -s32 sys_rsx_context_free() +/* + * lv2 SysCall 671 (0x29F): sys_rsx_context_free + * @param a1 (IN): RSX_context generated by sys_rsx_context_allocate to free the context. + */ +s32 sys_rsx_context_free(u32 context_id) { - sys_rsx.Todo("sys_rsx_context_free()"); + sys_rsx.Todo("sys_rsx_context_free(context_id=%d)", context_id); return CELL_OK; } @@ -55,21 +85,98 @@ s32 sys_rsx_context_iounmap() return CELL_OK; } -s32 sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6) +/* + * lv2 SysCall 674 (0x2A2): sys_rsx_context_attribute + * @param context_id (IN): RSX context, e.g. 0x55555555 + * @param package_id (IN): + * @param a3 (IN): + * @param a4 (IN): + * @param a5 (IN): + * @param a6 (IN): + */ +s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6) { - sys_rsx.Todo("sys_rsx_context_attribute(context_id=%d, a2=%llu, a3=%llu, a4=%llu, a5=%llu, a6=%llu)", context_id, a2, a3, a4, a5, a6); + sys_rsx.Todo("sys_rsx_context_attribute(context_id=0x%x, package_id=0x%x, a3=%llu, a4=%llu, a5=%llu, a6=%llu)", + context_id, package_id, a3, a4, a5, a6); + + switch(package_id) + { + case 0x001: // FIFO + break; + + case 0x100: // Display mode set + break; + + case 0x101: // Display sync + break; + + case 0x102: // Display flip + break; + + case 0x103: // ? + break; + + case 0x104: // Display buffer + break; + + case 0x106: // ? (Used by cellGcmInitPerfMon) + break; + + case 0x10a: // ? + break; + + case 0x300: // Tiles + break; + + case 0x301: // Depth-buffer (Z-cull) + break; + + case 0x600: // Framebuffer setup + break; + + case 0x601: // Framebuffer blit + break; + + case 0x602: // Framebuffer blit sync + break; + + default: + return CELL_EINVAL; + } + return CELL_OK; } -s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3) +/* + * lv2 SysCall 675 (0x2A3): sys_rsx_device_map + * @param a1 (OUT): For example: In vsh.self it is 0x60000000, global semaphore. For a game it is 0x40000000. + * @param a2 (OUT): Unused? + * @param dev_id (IN): An immediate value and always 8. (cellGcmInitPerfMon uses 11, 10, 9, 7, 12 successively). + */ +s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 dev_id) { - sys_rsx.Todo("sys_rsx_device_map(a1_addr=0x%x, a2_addr=0x%x, a3=%d)", a1.GetAddr(), a2.GetAddr(), a3); + sys_rsx.Todo("sys_rsx_device_map(a1_addr=0x%x, a2_addr=0x%x, a3=%d)", a1.GetAddr(), a2.GetAddr(), dev_id); + + if (dev_id > 15) { + // TODO: Throw RSX error + return CELL_EINVAL; + } + + if (dev_id == 0 || dev_id > 8) { + // TODO: lv1 related so we may ignore it. + // if (something) { return CELL_EPERM; } + } + return CELL_OK; } -s32 sys_rsx_device_unmap() +/* + * lv2 SysCall 676 (0x2A4): sys_rsx_device_unmap + * @param dev_id (IN): An immediate value and always 8. + */ +s32 sys_rsx_device_unmap(u32 dev_id) { - sys_rsx.Todo("sys_rsx_device_unmap()"); + sys_rsx.Todo("sys_rsx_device_unmap(a1=%d)", dev_id); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.h b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h index f51043315a..995aa29952 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rsx.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h @@ -3,13 +3,13 @@ // SysCalls s32 sys_rsx_device_open(); s32 sys_rsx_device_close(); -s32 sys_rsx_memory_allocate(); -s32 sys_rsx_memory_free(); -s32 sys_rsx_context_allocate(); -s32 sys_rsx_context_free(); +s32 sys_rsx_memory_allocate(mem32_t mem_handle, mem32_t mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7); +s32 sys_rsx_memory_free(u32 mem_handle); +s32 sys_rsx_context_allocate(mem32_t context_id, mem32_t lpar_dma_control, mem32_t lpar_driver_info, mem32_t lpar_reports, u64 mem_ctx, u64 system_mode); +s32 sys_rsx_context_free(u32 context_id); s32 sys_rsx_context_iomap(); s32 sys_rsx_context_iounmap(); -s32 sys_rsx_context_attribute(s32 context_id, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); -s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 a3); -s32 sys_rsx_device_unmap(); +s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6); +s32 sys_rsx_device_map(mem32_t a1, mem32_t a2, u32 dev_id); +s32 sys_rsx_device_unmap(u32 dev_id); s32 sys_rsx_attribute(); diff --git a/rpcs3/Gui/AutoPauseManager.cpp b/rpcs3/Gui/AutoPauseManager.cpp index 19c96ee06e..98235314fa 100644 --- a/rpcs3/Gui/AutoPauseManager.cpp +++ b/rpcs3/Gui/AutoPauseManager.cpp @@ -11,7 +11,7 @@ enum //TODO::Get the enable configuration from ini. AutoPauseManagerDialog::AutoPauseManagerDialog(wxWindow* parent) - : wxDialog(parent, wxID_ANY, "Auto-Pause Manager") + : wxDialog(parent, wxID_ANY, "Auto Pause Manager") { SetMinSize(wxSize(400, 360)); @@ -19,8 +19,7 @@ AutoPauseManagerDialog::AutoPauseManagerDialog(wxWindow* parent) m_entry_convert.clear(); m_entry_convert.str(""); - m_entry_convert << "To use Auto-Pause: need the IDs of Function call or System call. Need Restart game." - << " Disable/enable using setting Misc."; + m_entry_convert << "To use auto pause: enter the ID(s) of a function or a system call. Restart of the game is required to apply. You can enable/disable this in the settings."; wxStaticText* s_description = new wxStaticText(this, wxID_ANY, m_entry_convert.str(),wxDefaultPosition, wxDefaultSize, 0); s_description->Wrap(400); @@ -197,7 +196,7 @@ void AutoPauseManagerDialog::OnRemove(wxCommandEvent& event) void AutoPauseManagerDialog::OnSave(wxCommandEvent& event) { SaveEntries(); - LOG_SUCCESS(HLE,"Auto-Pause: File pause.bin was updated."); + LOG_SUCCESS(HLE,"Auto Pause: File pause.bin was updated."); //event.Skip(); } @@ -214,7 +213,7 @@ void AutoPauseManagerDialog::OnReload(wxCommandEvent& event) } AutoPauseSettingsDialog::AutoPauseSettingsDialog(wxWindow* parent, u32 *entry) - : wxDialog(parent, wxID_ANY, "Auto-Pause Setting") + : wxDialog(parent, wxID_ANY, "Auto Pause Setting") , m_presult(entry) { m_entry = *m_presult; @@ -225,8 +224,7 @@ AutoPauseSettingsDialog::AutoPauseSettingsDialog(wxWindow* parent, u32 *entry) m_entry_convert.clear(); m_entry_convert.str(""); - m_entry_convert << "Specify ID of System Call or Function Call below." - << " Please remember give the Hexidemical id."; + m_entry_convert << "Specify ID of System Call or Function Call below. You need to use a Hexadecimal ID."; wxStaticText* s_description = new wxStaticText(this, wxID_ANY, m_entry_convert.str(), wxDefaultPosition, wxDefaultSize, 0); s_description->Wrap(400); @@ -249,7 +247,7 @@ AutoPauseSettingsDialog::AutoPauseSettingsDialog(wxWindow* parent, u32 *entry) m_entry_convert << std::hex << std::setw(8) << std::setfill('0') << m_entry; m_id->SetValue(m_entry_convert.str()); - SetTitle("Auto-Pause Setting: "+m_entry_convert.str()); + SetTitle("Auto Pause Setting: "+m_entry_convert.str()); Bind(wxEVT_BUTTON, &AutoPauseSettingsDialog::OnOk, this, wxID_OK); Bind(wxEVT_TEXT, &AutoPauseSettingsDialog::OnUpdateValue, this, wxID_STATIC); diff --git a/rpcs3/Gui/ConLogFrame.cpp b/rpcs3/Gui/ConLogFrame.cpp index be7f4fc6ef..0e2ee848e5 100644 --- a/rpcs3/Gui/ConLogFrame.cpp +++ b/rpcs3/Gui/ConLogFrame.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include +#include #include #include #include @@ -24,6 +25,12 @@ const int BUFFER_MAX_SIZE = 1024 * 1024; //amount of characters in the TextCtrl text-buffer for the emulation log const int GUI_BUFFER_MAX_SIZE = 1024 * 1024; +enum +{ + id_log_copy, //Copy log to ClipBoard + id_log_clear //Clear log +}; + struct wxWriter : Log::LogListener { wxTextCtrl *m_log; @@ -146,6 +153,10 @@ LogFrame::LogFrame(wxWindow* parent) SetSizer(s_main); Layout(); + m_log->Bind(wxEVT_RIGHT_DOWN, &LogFrame::OnRightClick, this); + Bind(wxEVT_MENU, &LogFrame::OnContextMenu, this, id_log_clear); + Bind(wxEVT_MENU, &LogFrame::OnContextMenu, this, id_log_copy); + Show(); } @@ -162,4 +173,40 @@ bool LogFrame::Close(bool force) void LogFrame::OnQuit(wxCloseEvent& event) { event.Skip(); +} + +//Deals with the RightClick on Log Console, shows up the Context Menu. +void LogFrame::OnRightClick(wxMouseEvent& event) +{ + wxMenu* menu = new wxMenu(); + + menu->Append(id_log_copy, "&Copy"); + menu->AppendSeparator(); + menu->Append(id_log_clear, "C&lear"); + + PopupMenu(menu); +} +//Well you can bind more than one control to a single handler. +void LogFrame::OnContextMenu(wxCommandEvent& event) +{ + int id = event.GetId(); + switch (id) + { + case id_log_clear: + m_log->Clear(); + break; + case id_log_copy: + if (wxTheClipboard->Open()) + { + m_tdo = new wxTextDataObject(m_log->GetStringSelection()); + if (m_tdo->GetTextLength() > 0) + { + wxTheClipboard->SetData(new wxTextDataObject(m_log->GetStringSelection())); + } + wxTheClipboard->Close(); + } + break; + default: + event.Skip(); + } } \ No newline at end of file diff --git a/rpcs3/Gui/ConLogFrame.h b/rpcs3/Gui/ConLogFrame.h index df5e4d25ff..da7749b619 100644 --- a/rpcs3/Gui/ConLogFrame.h +++ b/rpcs3/Gui/ConLogFrame.h @@ -1,4 +1,5 @@ #pragma once +#include #include "Utilities/Log.h" @@ -9,6 +10,8 @@ class LogFrame wxAuiNotebook m_tabs; wxTextCtrl *m_log; wxTextCtrl *m_tty; + //Copy Action in Context Menu + wxTextDataObject* m_tdo; public: LogFrame(wxWindow* parent); @@ -21,6 +24,8 @@ private: virtual void Task(){}; void OnQuit(wxCloseEvent& event); + void OnRightClick(wxMouseEvent& event); //Show context menu + void OnContextMenu(wxCommandEvent& event); //After select DECLARE_EVENT_TABLE(); }; \ No newline at end of file diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index 6a46ee08bf..69249a2fd8 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -89,7 +89,7 @@ MainFrame::MainFrame() menu_conf->Append(id_config_emu, "Settings"); menu_conf->Append(id_config_pad, "PAD Settings"); menu_conf->AppendSeparator(); - menu_conf->Append(id_config_autopause_manager, "Auto-Pause Settings"); + menu_conf->Append(id_config_autopause_manager, "Auto Pause Settings"); menu_conf->AppendSeparator(); menu_conf->Append(id_config_vfs_manager, "Virtual File System Manager"); menu_conf->Append(id_config_vhdd_manager, "Virtual HDD Manager"); @@ -398,9 +398,10 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxCheckBox* chbox_hle_savetty = new wxCheckBox(p_hle, wxID_ANY, "Save TTY output to file"); wxCheckBox* chbox_hle_exitonstop = new wxCheckBox(p_hle, wxID_ANY, "Exit RPCS3 when process finishes"); wxCheckBox* chbox_hle_always_start = new wxCheckBox(p_hle, wxID_ANY, "Always start after boot"); - //Auto-Pause related - wxCheckBox* chbox_dbg_ap_systemcall = new wxCheckBox(p_hle, wxID_ANY, "Auto-Pause at System Call"); - wxCheckBox* chbox_dbg_ap_functioncall = new wxCheckBox(p_hle, wxID_ANY, "Auto-Pause at Function Call"); + + //Auto Pause + wxCheckBox* chbox_dbg_ap_systemcall = new wxCheckBox(p_hle, wxID_ANY, "Auto Pause at System Call"); + wxCheckBox* chbox_dbg_ap_functioncall = new wxCheckBox(p_hle, wxID_ANY, "Auto Pause at Function Call"); cbox_cpu_decoder->Append("PPU Interpreter & DisAsm"); cbox_cpu_decoder->Append("PPU Interpreter"); @@ -463,7 +464,6 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_sys_lang->Append("Polish"); cbox_sys_lang->Append("English (UK)"); - // Get values from .ini chbox_gs_log_prog ->SetValue(Ini.GSLogPrograms.GetValue()); chbox_gs_dump_depth ->SetValue(Ini.GSDumpDepthBuffer.GetValue()); @@ -476,7 +476,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) chbox_hle_savetty ->SetValue(Ini.HLESaveTTY.GetValue()); chbox_hle_exitonstop ->SetValue(Ini.HLEExitOnStop.GetValue()); chbox_hle_always_start ->SetValue(Ini.HLEAlwaysStart.GetValue()); - //Auto-Pause related + + //Auto Pause related chbox_dbg_ap_systemcall ->SetValue(Ini.DBGAutoPauseSystemCall.GetValue()); chbox_dbg_ap_functioncall->SetValue(Ini.DBGAutoPauseFunctionCall.GetValue()); @@ -492,14 +493,12 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_hle_loglvl ->SetSelection(Ini.HLELogLvl.GetValue()); cbox_sys_lang ->SetSelection(Ini.SysLanguage.GetValue()); - - // Enable / Disable parameters + // Enable/Disable parameters chbox_audio_dump->Enable(Emu.IsStopped()); chbox_audio_conv->Enable(Emu.IsStopped()); chbox_hle_logging->Enable(Emu.IsStopped()); chbox_hle_hook_stfunc->Enable(Emu.IsStopped()); - s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_spu_decoder->Add(cbox_spu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -547,7 +546,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel_hle->Add(chbox_hle_savetty, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_exitonstop, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_always_start, wxSizerFlags().Border(wxALL, 5).Expand()); - //Auto-Pause + + //Auto Pause s_subpanel_hle->Add(chbox_dbg_ap_systemcall, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_dbg_ap_functioncall, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -594,7 +594,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.HLELogLvl.SetValue(cbox_hle_loglvl->GetSelection()); Ini.SysLanguage.SetValue(cbox_sys_lang->GetSelection()); Ini.HLEAlwaysStart.SetValue(chbox_hle_always_start->GetValue()); - //Auto-Pause + + //Auto Pause Ini.DBGAutoPauseFunctionCall.SetValue(chbox_dbg_ap_functioncall->GetValue()); Ini.DBGAutoPauseSystemCall.SetValue(chbox_dbg_ap_systemcall->GetValue()); diff --git a/rpcs3/Gui/RSXDebugger.cpp b/rpcs3/Gui/RSXDebugger.cpp index d3aeb017ae..0a437560be 100644 --- a/rpcs3/Gui/RSXDebugger.cpp +++ b/rpcs3/Gui/RSXDebugger.cpp @@ -292,7 +292,7 @@ void RSXDebugger::OnClickBuffer(wxMouseEvent& event) { if (!RSXReady()) return; const GSRender& render = Emu.GetGSManager().GetRender(); - const mem_ptr_t buffers = render.m_gcm_buffers_addr; + const mem_ptr_t buffers = render.m_gcm_buffers_addr; if(!buffers.IsGood()) return; @@ -300,9 +300,9 @@ void RSXDebugger::OnClickBuffer(wxMouseEvent& event) // TODO: Is there any better way to choose the color buffers #define SHOW_BUFFER(id) \ { \ - u32 addr = render.m_local_mem_addr + re(buffers[id].offset); \ - if(Memory.IsGoodAddr(addr) && buffers[id].width && buffers[id].height) \ - MemoryViewerPanel::ShowImage(this, addr, 3, re(buffers[id].width), re(buffers[id].height), true); \ + u32 addr = render.m_local_mem_addr + buffers[id].offset; \ + if (Memory.IsGoodAddr(addr) && buffers[id].width && buffers[id].height) \ + MemoryViewerPanel::ShowImage(this, addr, 3, buffers[id].width, buffers[id].height, true); \ return; \ } \ @@ -409,16 +409,16 @@ void RSXDebugger::GetBuffers() if(!Memory.IsGoodAddr(render.m_gcm_buffers_addr)) continue; - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(render.m_gcm_buffers_addr); - u32 RSXbuffer_addr = render.m_local_mem_addr + re(buffers[bufferId].offset); + CellGcmDisplayInfo* buffers = (CellGcmDisplayInfo*)Memory.GetMemFromAddr(render.m_gcm_buffers_addr); + u32 RSXbuffer_addr = render.m_local_mem_addr + buffers[bufferId].offset; if(!Memory.IsGoodAddr(RSXbuffer_addr)) continue; unsigned char* RSXbuffer = (unsigned char*)Memory.VirtualToRealAddr(RSXbuffer_addr); - u32 width = re(buffers[bufferId].width); - u32 height = re(buffers[bufferId].height); + u32 width = buffers[bufferId].width; + u32 height = buffers[bufferId].height; unsigned char* buffer = (unsigned char*)malloc(width * height * 3); // ABGR to RGB and flip vertically diff --git a/rpcs3/Gui/SaveDataUtility.cpp b/rpcs3/Gui/SaveDataUtility.cpp index 82ed6a70d2..46ca644106 100644 --- a/rpcs3/Gui/SaveDataUtility.cpp +++ b/rpcs3/Gui/SaveDataUtility.cpp @@ -52,7 +52,7 @@ void SaveDataInfoDialog::UpdateData() m_list->SetItem(3, 1, "Stub it first"); m_list->InsertItem(4, 4); - m_list->SetItem(4, 0, "Copy-Able?"); + m_list->SetItem(4, 0, "Copyable"); m_list->SetItem(4, 1, "1 (Not allowed)"); m_list->InsertItem(5, 5); @@ -105,7 +105,7 @@ SaveDataManageDialog::SaveDataManageDialog(wxWindow* parent, unsigned int* sort_ m_sort_options->SetSelection(*m_sort_type); s_sort->Add(m_sort_options, 1, wxALL | wxEXPAND, 5); - wxButton* s_sort_action = new wxButton(this, wxID_ANY, wxT("&Apply!"), wxDefaultPosition, wxDefaultSize, 0); + wxButton* s_sort_action = new wxButton(this, wxID_ANY, wxT("&Apply"), wxDefaultPosition, wxDefaultSize, 0); s_sort_action->Bind(wxEVT_BUTTON, &SaveDataManageDialog::OnApplySort, this); s_sort->Add(s_sort_action, 0, wxALL, 5); @@ -173,8 +173,7 @@ SaveDataListDialog::SaveDataListDialog(wxWindow* parent, bool enable_manage) m_entry_convert.clear(); m_entry_convert.str(""); - m_entry_convert << "This is only a stub now. Don't expect real effect from this." - << "Cause related functions hasn't been implemented yet."; + m_entry_convert << "This is only a stub for now. This doesn't work yet due to related functions not being implemented."; wxStaticText* s_description = new wxStaticText(this, wxID_ANY, m_entry_convert.str(), wxDefaultPosition, wxDefaultSize, 0); s_description->Wrap(400); s_main->Add(s_description, 0, wxALL, 5); diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index f812f6296e..5374ac8fbc 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -152,7 +152,7 @@ public: IniEntry HLELogLvl; IniEntry HLEAlwaysStart; - //Auto-Pause + //Auto Pause IniEntry DBGAutoPauseSystemCall; IniEntry DBGAutoPauseFunctionCall; @@ -221,7 +221,7 @@ public: HLELogLvl.Init("HLE_HLELogLvl", path); HLEAlwaysStart.Init("HLE_HLEAlwaysStart", path); - // Auto-Pause + // Auto Pause DBGAutoPauseFunctionCall.Init("DBG_AutoPauseFunctionCall", path); DBGAutoPauseSystemCall.Init("DBG_AutoPauseSystemCall", path); @@ -285,7 +285,8 @@ public: HLEExitOnStop.Load(false); HLELogLvl.Load(3); HLEAlwaysStart.Load(true); - //Auto-Pause + + //Auto Pause DBGAutoPauseFunctionCall.Load(false); DBGAutoPauseSystemCall.Load(false); @@ -350,7 +351,8 @@ public: HLEExitOnStop.Save(); HLELogLvl.Save(); HLEAlwaysStart.Save(); - //Auto-Pause + + //Auto Pause DBGAutoPauseFunctionCall.Save(); DBGAutoPauseSystemCall.Save(); diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index a714d2e80c..8c74b31988 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -356,8 +356,10 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index ec32261038..db572c65f9 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -390,7 +390,7 @@ Emu\Cell\currently_unused - Emu\Cell\currently_unused + Emu\SysCalls\Modules Emu\Cell\currently_unused @@ -664,6 +664,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules + Emu\SysCalls\Modules @@ -1153,5 +1156,8 @@ Utilities + + Emu\SysCalls\Modules + \ No newline at end of file