diff --git a/rpcs3/Emu/SysCalls/ModuleManager.cpp b/rpcs3/Emu/SysCalls/ModuleManager.cpp index 76df8fb2f7..26c4adbd1b 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.cpp +++ b/rpcs3/Emu/SysCalls/ModuleManager.cpp @@ -31,14 +31,16 @@ 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 cellGem_init(); +extern Module *cellGem; +extern void cellGifDec_init(); +extern Module *cellGifDec; extern void sys_io_init(); extern Module *sys_io; extern void cellL10n_init(); @@ -219,6 +221,8 @@ 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); + cellGem = static_cast (&(m_mod_init.back())) + 1; + m_mod_init.emplace_back(0x005a, cellGem_init); 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; 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/emucore.vcxproj b/rpcs3/emucore.vcxproj index a714d2e80c..4aa03b9806 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -356,6 +356,7 @@ + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index ec32261038..f81204a0a9 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