Sly 1:Executable: Difference between revisions
(Rework section on __main & a couple other things) |
(add c++ abi/libgcc2) |
||
Line 19: | Line 19: | ||
==== Standard libraries ==== |
==== Standard libraries ==== |
||
These libraries are shipped either by the Cygnus ee-gcc toolchain or gcc directly. |
These libraries are shipped either by the Cygnus ee-gcc toolchain or provided as a part of gcc directly. |
||
* '''libgcc''' – GCC internal runtime library |
* '''libgcc''' – GCC internal runtime library |
||
* ''' |
* '''libgcc2''' - GCC internal runtime library (provides C++ ABI routines and other misc. runtime functions) |
||
* '''newlib''' – Embedded C standard library implementation |
|||
* '''libio –''' GNU implementation of C++ IO streams |
* '''libio –''' GNU implementation of C++ IO streams |
||
* '''libstdc++ –''' GNU C++ standard library |
* '''libstdc++ –''' GNU C++ standard library |
||
Line 28: | Line 29: | ||
==== PS2 SDK libraries ==== |
==== PS2 SDK libraries ==== |
||
These libraries are part of the PS2 SDK and written by SCEI. |
These libraries are part of the PS2 SDK and written by SCEI. |
||
* '''libkernel''' – Interface to the EE Kernel (syscall wrappers/etc.) |
* '''libkernel''' – Interface to the EE Kernel (syscall wrappers/etc.) |
||
* '''libmc 2430''' – Memory card library |
* '''libmc 2430''' – Memory card library |
Revision as of 01:27, 4 November 2022
SCUS_971.98 is the executable for Sly Cooper and the Thievius Raccoonus. It is an ELF binary compiled for the PS2’s Emotion Engine processor. The compiler is GCC v2.9-ee-991111b.[1]
Libraries
IOP module libraries
These library files are included on the disc alongside the game executable, and are loaded on the IOP core by it.
- sio2man.irx – Manager Interface for joypads, multitaps and memory cards[2]
- padman.irx – Gamepad manager[2]
- mcman.irx – Memory card manager[2]
- mcserv.irx – Memory card server[2]
- libsd.irx – Sound library[2]
- 989snd.irx – Sound driver
Static libraries
These libraries are bundled with the executable and some are only referenced by name in some strings.
Standard libraries
These libraries are shipped either by the Cygnus ee-gcc toolchain or provided as a part of gcc directly.
- libgcc – GCC internal runtime library
- libgcc2 - GCC internal runtime library (provides C++ ABI routines and other misc. runtime functions)
- newlib – Embedded C standard library implementation
- libio – GNU implementation of C++ IO streams
- libstdc++ – GNU C++ standard library
PS2 SDK libraries
These libraries are part of the PS2 SDK and written by SCEI.
- libkernel – Interface to the EE Kernel (syscall wrappers/etc.)
- libmc 2430 – Memory card library
- libgraph 2400 – Graphics Synthesizer library[3]
- libdma 2400 – Direct Memory Access (DMA) library
- libcdvd 2420 – CD/DVD library
- libpad 2410 – DualShock gamepad library
- libipu 2400 – Image data Processor (IPU) library[3]
Initialization and main loop
The entry point for the executable is _start
, which is provided by the PS2 SDK's crt0.s
.
It sets up the main thread, initializes the main thread's heap, and calls main
. The main
function takes two arguments, int cphzArgs
(the number of arguments) and char** apchzArgs
(the array of arguments). It performs some initialization and begins the main game loop.
Initialization
main
starts by calling __main
, a libgcc function that iterates through a generated table of initialization functions which initialize global variables and construct global objects, calling them all.
Execution then returns to main
which stores the passed parameters in g_cphzArgs
and g_apchzArgs
respectively. It then calls Startup
, a function which initializes even more game variables.
This topic needs further investigation. |
Game loop
The logic of the main game loop can be broken down as follows.
- First, check if
g_mpeg
has an MPEG queued to be played. If so:FlushFrames(1)
– Calls some graphics functions and swap the graphics synthesizer buffersCTransition::Execute(&g_transition)
– Executes the MPEG on the global transition instance
- Check if
g_transition
has a pending transition (m_fPending != 0
). If so:FlushFrames(1)
- Call a function that calls
CMpeg::Execute
on theg_transition
instance.
- Check again if
g_mpeg
has an MPEG queued to be played (this happens if two MPEGs were queued to play back-to-back) If so:FlushFrames(1)
CTransition::Execute(&g_transition)
UpdateJoy(&g_joy)
– Handles controller inputUpdateCodes()
– Watches for cheat code inputs- Call an unknown function that handles saving the game.
UpdateUi(&g_ui)
– Updates the state of the GUIUpdateGameState(g_clock.dt)
– Updates the running timers on the game state structsif (g_psw != NULLPTR)
– If g_psw is not null..SetupCm(g_pcm)
– Sets up some camera values to render the next frameOpenFrame()
– Prepares to render the next frameMarkClockTick(&g_clock)
– Updates the global clock values- Grab a particular function pointer from the
g_psw
struct and execute it if it is not NULL. The function's purpose is unknown but it takesg_clock.dt
as an argument, so it's probably an Update function. RenderSw(g_psw, g_pcm)
– Renders game objects from the given camera perspectiveRenderUi()
– Renders the GUI blots on the current frameDrawSw(g_psw, g_pcm)
– Draws the game objects from the given camera perspectiveDrawUi()
– Draws the GUI elements on the frameCloseFrame()
– Finishes rendering the frame
- Increment the global frame counter,
g_cframe
.
This routine continues in an infinite loop unless Exit
is called or a handled exception causes execution to halt, in which case you are immediately booted back to the PS2 BIOS.
Build strings
The executable contains the following strings generated during the build process.
g_achzBuildUser
jojo
g_achzBuildDateLong
08/24/02 22:06
g_achzBuildDateShort
0824.2206
References
- ↑ Based on strings found in the May 2002 demo build
- ↑ 2.0 2.1 2.2 2.3 2.4 IRX Files for Playstation 2 - Retro Reversing, 29 March 2021
- ↑ 3.0 3.1 Static Libraries (.A) for Playstation 2 Emotion Engine - Retro Reversing, 9 July 2022