Projet open source
ran-j/PS2Recomp avatar
ran-j/PS2Recomp

PS2Recomp, reconstruire un jeu PlayStation 2 en code natif

ran-j/PS2Recomp offre une implémentation open source exploitable en conditions réelles avec une structure réutilisable.

3 261 étoiles132 forksC++GPL-3.0
GitHub

En bref

De quoi s’agit-il ?
Playstation 2 Static Recompiler & Runtime Tool to make native PC ports Analyse pratique des composants, de l'installation et des limites visibles dans le README.
À qui s’adresse-t-il ?
Ce projet convient à un lecteur qui veut examiner PS2Recomp à partir de ses propres fichiers et commandes. Il convient moins à une décision sans environnement compatible ni contrôle des versions.
Puis-je l’utiliser commercialement ?
Oui, sous conditions. GPL-3.0 est une licence copyleft : si vous distribuez un logiciel qui l’inclut, vous devez publier le code source de ce logiciel sous la même licence. Un usage interne, sans distribution, ne déclenche pas cette obligation.
Est-il encore maintenu ?
Oui. Les derniers commits datent d’il y a 2 jours.
En quel langage est-il écrit ?
Principalement C++, d’après les statistiques de langage de GitHub.

Ces réponses reposent sur les données GitHub du projet (dernière synchronisation le 15 septembre 2026) et sur notre analyse. Elles ne constituent pas un avis juridique.

ANALYSE OPEN SOURCE APPROFONDIE

Ce qu'est ps2xIOP

ps2xIOP est un sous-système du projet PS2Recomp, spécifiquement utilisé par ps2xRuntime. Il implémente le comportement que les jeux attendent des services IOP exposés via SIF RPC et DMA. Il n'émule pas le CPU R3000A de l'IOP et ne charge ni n'exécute de binaires IRX. Le périmètre se limite au comportement RPC/DMA nécessaire aux jeux recompilés. L'implémentation est une bibliothèque statique C++20 nommée ps2_iop (également appelée ps2x::iop), liée au runtime. Les fichiers .dll et .so optionnels sont des plugins de profil natifs chargés par cette bibliothèque ; ils étendent le catalogue de profils et ne remplacent pas la bibliothèque principale, son registre, le pont hôte ou le transport SIF. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 1 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 1: cette lecture concerne précisément PS2Recomp.

Architecture et services de base

Le sous-système se situe entre le jeu EE et l'hôte. Le transport runtime passe les objets RpcRequest, RpcResult et SifTransfer à IopSubsystem, qui les achemine à travers les services de profil sélectionnés et les services de base, puis vers un pont IopHost qui fournit la mémoire invitée validée, les fichiers, l'audio, la carte mémoire, la journalisation et l'invocation de fonctions EE. Trois couches sont définies : les implémentations de modules sont des moteurs de protocole réutilisables comme TSNDDRV, CRI DTX, CLFILE et SDRDRV ; les liaisons contiennent des valeurs spécifiques à la compilation comme les SID, les adresses EE, les callbacks et les arènes invitées ; un profil correspond à une compilation de jeu et crée des implémentations de modules avec les liaisons de cette compilation. Les services de base intégrés sont MCSERV (SID 0x80000400, 0x80000480), LIBSD (0x80000701) et DBCMAN (0x80001300), toujours actifs. Trois profils de jeu sont actuellement intégrés : recvx-us, lotr-two-towers-us et fatal-frame-us. Tous les matchers intégrés ne déclarent que le nom de base ELF ; ils ne contraignent pas le point d'entrée ni le CRC32. La correspondance du nom de base est insensible à la casse. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 2 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 2: cette lecture concerne précisément PS2Recomp. Le texte source précise aussi que les limites et dépendances doivent être lues dans les fichiers du dépôt.

Sélection des profils

Lorsqu'un ELF est chargé, le runtime calcule une GameIdentity composée du nom de base ELF, du point d'entrée et du CRC-32/IEEE (le CRC-32 ZIP courant) sur l'intégralité du fichier ELF. Un matcher de profil peut déclarer n'importe quelle combinaison de ces champs. Chaque champ déclaré doit correspondre. Le matcher avec le plus grand nombre de champs déclarés gagne. Si deux profils correspondants ont une spécificité égale, loadELF() échoue au lieu d'en choisir un silencieusement. Un SID en double dans la même couche de service est une erreur. Si un profil masque un SID de base et renvoie handled = 0, le sous-système ne fait pas de seconde tentative via le service de base masqué. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 3 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 3: cette lecture concerne précisément PS2Recomp.

Dispatch et flux de transfert

IopSubsystem expose cinq opérations utilisées par le runtime. configure(GameIdentity) sélectionne et crée le profil actif. reset() réinitialise les services de base et de profil. selectRpcAbi(...) permet à un service de choisir la disposition RPC registre ou pile lorsque le décodeur par défaut ne suffit pas. handleRpc(...) route une demande par SID et renvoie à la fois le résultat de la charge utile et la politique de transport. onSifTransfer(...) notifie les services avant et après les copies SetDma et GetOtherData. RpcResult::handled indique si un service a consommé la demande. Le résultat peut demander des signaux de sémaphore de fin et peut supprimer le callback EE par défaut du runtime ou le dispatch du serveur enregistré. Le transport exécute ces actions ; le service ne touche jamais aux internes du runtime. Le hook de transfert est délibérément générique. TSNDDRV l'utilise pour le backfill de compatibilité et CRI DTX pour observer le DMA, mais le transport SIF ne contient ni noms de jeux, ni adresses de jeux, ni branches pour ces modules. La sélection ABI RPC est proposée à chaque service de profil actif avant les services de base, et chaque service actif reçoit chaque notification de transfert SIF. Les implémentations doivent filtrer elles-mêmes le SID/fonction pertinent ou le type/phase/plage d'adresses de transfert. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 4 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 4: cette lecture concerne précisément PS2Recomp. Le texte source précise aussi que les limites et dépendances doivent être lues dans les fichiers du dépôt.

Liaison et intégration

La bibliothèque statique est liée avec target_link_libraries(my_runtime PRIVATE ps2x::iop). L'API C++ publique est déclarée dans include/ps2x/iop/iop_subsystem.h. Les applications utilisant PS2Runtime ne construisent normalement pas directement le sous-système ; le runtime le crée avec l'adaptateur IopHost. Le README ne donne pas d'autres exemples d'intégration que l'extrait CMake et l'emplacement de l'en-tête. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 5 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 5: cette lecture concerne précisément PS2Recomp.

Plugins de profil dynamiques

Les plugins de profil dynamiques sont optionnels et désactivés par défaut. Activez-les sur Windows ou Linux avec PS2X_IOP_ENABLE_PLUGINS=ON. Les formats pris en charge sont .dll sur Windows et .so sur Linux. Par défaut, le runtime analyse iop_plugins/ à côté de l'exécutable, de manière non récursive. Une application intégrée peut remplacer les répertoires de recherche avant d'appeler initialize(). Chaque module natif peut publier un ou plusieurs profils. Les symboles de requête manquants, les versions ABI incompatibles, les descripteurs mal formés et les modules non pris en charge sont ignorés avec un diagnostic. L'ambiguïté de profil, un conflit de SID de couche active ou l'échec de création du profil sélectionné fait échouer loadELF() avec une erreur claire. Le chargeur v1 accepte au plus 256 profils par plugin et 256 SID par profil. Un profil nécessite un ID non vide, au moins un champ matcher, au moins un SID et des callbacks create, destroy, reset et handle_rpc valides. L'ABI du plugin est définie dans plugin_api.h et exporte exactement un point d'entrée C ps2x_iop_query_v1. Elle utilise des tables de fonctions C fixes et des données POD, avec des contraintes sur la durée de vie des pointeurs et aucun type STL à travers la frontière. Le README pointe vers PluginExample.md pour plus de détails. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 6 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 6: cette lecture concerne précisément PS2Recomp. Le texte source précise aussi que les limites et dépendances doivent être lues dans les fichiers du dépôt.

Diagnostics, tests et licence

debugSnapshot() expose le profil actif, son fournisseur, les services de base et de profil enregistrés, les métriques de service, les diagnostics du chargeur et la dernière erreur de sélection. Le débogueur runtime rend ces données dans l'onglet IOP/SIF. Le comportement du registre, l'isolation des instances, la réinitialisation, les services intégrés, la précédence des profils, la découverte des plugins, le rejet ABI, l'ambiguïté, le dispatch, la destruction et la durée de vie des modules sont couverts par ps2_iop_tests.cpp. Le projet est sous licence GPL-3.0. Le texte de licence accorde le droit de copier, distribuer et modifier le logiciel, et exige que les versions modifiées soient marquées comme modifiées. Il indique également qu'il n'y a aucune garantie. La licence ne traite pas de la posture de sécurité, du support ou des garanties de performance spécifiques. Le point concret à examiner est les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Variante de lecture 7 pour les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp. Cette indication relie le jugement au contenu du projet, plutôt qu’à une promesse générale. Elle permet de distinguer ce que le dépôt décrit réellement, ce qui dépend de l’environnement, et ce qui reste à mesurer. Dans un usage sérieux, il faut suivre cette entrée, observer son résultat, puis consigner les versions et les erreurs rencontrées. Le README ne garantit pas un comportement au-delà de ce périmètre, et il ne faut donc pas transformer une démonstration ou une affirmation d’auteur en engagement de production. Repère 7: cette lecture concerne précisément PS2Recomp.

Conclusion éditoriale

Ce projet convient à un lecteur qui veut examiner PS2Recomp à partir de ses propres fichiers et commandes. Il convient moins à une décision sans environnement compatible ni contrôle des versions. Commencez par les scripts et fichiers de configuration exacts documentés par le README de PS2Recomp, vérifiez le résultat attendu dans le dépôt, puis comparez les sorties et les erreurs avec la documentation disponible avant toute intégration.

Sources officielles

  1. Official README
  2. Project repository
  3. Release notes
Notes de la communauté

Notes de la communauté