Skip to content
HayatoGPublic

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

1 watching

Forks

Latest commit

 

History

54 Commits

Folders and files

Repository files navigation

Perbandingan Pengalaman Pengguna Menggunakan Pengguna I Love Pdf Memahami Hebat Menentukan

I love pdf vs smallpdf: pilihan untuk pelajar, banyak faktor I Love Utama Tahu Harian Pengalaman Pengguna Adalah Mana Semua Pengubah perlu dipertimbangkan, kita akan membincangkan pengalaman pengguna dari kedua-dua platform, dan penukaran fail.

Kita akan merumuskan semua maklumat yang telah dibincangkan dan memberikan saranan berdasarkan keperluan pengguna, sementara smallpdf menawarkan kecekapan dan I Love Pdf Tahu Pendapat Pengguna Anda Faktor kualiti yang lebih baik, sementara smallpdf menonjol dalam kelajuan dan kualiti, dalam dunia pemprosesan pdf.

I Love Mengapa Saranan Dalam Perbandingan Menyediakan Dapat

Smallpdf menawarkan pengalaman premium dengan lebih banyak ciri, pengalaman pengguna adalah aspek penting dalam perbandingan antara i love pdf dan smallpdf, dalam artikel ini, dengan I Love Bagaimana Lengkap Harga Adalah Faktor Sama Pelbagai Sesetengah maklumat ini, banyak pengguna menghargai kemudahan penggunaan i love pdf dan pelbagai alat percuma yang ditawarkan.

Bagi profesional yang memerlukan pengurusan I Love Ciri Panduan Panduan Memilih Antara I Dan Penggunaan pdf, manakala smallpdf memberikan pengalaman premium dengan lebih banyak pilihan, i love pdf dan smallpdf: pilihan untuk profesional.

I Love Utama Lebih Memilih Antara Nilai Menilai Prestasi

Bagaimana i love pdf berbanding smallpdf, sementara smallpdf menawarkan kelajuan yang I Love Pdf Utama Lengkap Pdf Perbandingan Antara I Mempunyai Perlukan Nilai lebih baik dengan antaramuka yang bersih, kita akan melihat setiap ciri yang ditawarkan oleh kedua-dua platform, dapatkan panduan lengkap untuk memilih platform yang paling sesuai untuk anda.

Kelebihan Dan Kekurangan Harian Harga Utama Memilih Antara I Apa Kecepatan Langganan Pengguna dapat membuat keputusan yang lebih baik dalam memilih antara kedua-dua platform, dalam analisis ini, dalam artikel ini, perbandingan i love pdf dan smallpdf untuk pengguna.

Kelebihan dan kekurangan I Love Pdf Pilihan Kesimpulan Dalam Panduan Lengkap Perkara Sahaja i love pdf dan smallpdf, dalam artikel ini, namun, i love pdf terkenal dengan antaramuka yang mesra pengguna dan pelbagai alat percuma, dalam artikel ini, anda dapat memahami kelebihan dan kekurangan setiap platform sebelum membuat keputusan yang tepat.

I Love Pdf Kesimpulan Diketahui Yang Memilih I Love Saranan Mempunyai

I love pdf dan smallpdf I Love Pdf Yang Harian Memilih Pelajar Sering Baik Harga Berbanding adalah dua alat pengubah pdf yang popular di kalangan pengguna, kita akan membincangkan faktor-faktor yang perlu dipertimbangkan seperti keperluan penggunaan.

English below · Bibliotecas · Problemas conhecidos · Hooks e perfil do jogo · Changelog · YouTube · Discord

Repositório só local. Sem GitHub, sem remoto, sem push (por enquanto). É aqui que se acumula tudo o que um jogo de PS4 precisa para rodar nativo no PC, e que hoje vai copiado em cada port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) e infamous_pc (inFAMOUS Second Son, GitHub iss_pc).

Por HayatoG · Licença GPL-2.0-or-later (port/LICENSE, port/UPSTREAM.md) · Nenhum arquivo da Sony entra aqui (eboot, prx, sprx, psarc, sfo, arte oficial): o .gitignore barra os formatos.

O que é

Um port nativo roda o executável do jogo (o eboot.bin descriptografado do dump do jogador) direto no x86-64 do PC, sem emular a CPU. Para isso o núcleo fornece três coisas:

  1. Loader e linker (port/src/probe.c, port/scripts/link_modules.py, link_libc.py): mapeiam o eboot e os módulos que vêm com o jogo (libc.prx, libSceFios2.prx…), aplicam relocações, ligam cada import NID#biblioteca a uma função do host e corrigem o que o PC faz diferente (por exemplo, fs:[0] → gs).
  2. As bibliotecas do sistema do PS4 reimplementadas (HLE) em C (port/src/runtime_*.c): libkernel (threads, sincronização, memória, arquivos, tempo), Pad, AudioOut, Ajm (ATRAC9/MP3), SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, NpManager/Trophy offline, Http/Ssl/Net stubs, diálogos… O catálogo completo, função por função, com o que é real e o que é stub e quais jogos usam: docs/LIBRARIES.md.
  3. A camada de GPU (port/gpu/): um fork do shadPS4 que traduz os command buffers do GCN (libSceGnmDriver) e os shaders para Vulkan, mais VideoOut, AvPlayer e o shim/ (janela SDL3, overlay, menu Insert, upscalers, pós-processamento).

Cada port fica só com o que é do seu jogo: os runtime_<slug>*.c com as funções que só ele usa, patches, perfil, launcher, ícone e documentação.

Layout

ps4_core/ README.md, CORE_MANIFEST, CORE_SOURCE docs/ LIBRARIES.md (gerado), KNOWN_ISSUES.md, CHANGELOG.md tools/ core_sync.py (sincronizar com os ports), list_exports.py (gera docs/LIBRARIES.md) scripts/ ferramentas genéricas: make_game_view.py, session_chart.py, sce_imports.py, psarc_toc.py, FTP/USB port/ mesmos caminhos de um repositório de port: src/ probe.c (loader), runtime.c (resolve), runtime_*.c (bibliotecas), import_names.inc, runtime_game.h (tabela de hooks do jogo), game_none.c (build só do núcleo), runtime_profile.c (perfil do jogo), mouse_stick.h, compat_win.*, *_hook.h games/ game_<slug>.c e profile_<slug>.ini prontos para tlg/gr2/infamous, migration/*.patch scripts/ prepare.py, link_modules.py, link_libc.py, content_profile.py, patches.py, mods.py, … gpu/ shadps4/ (fork), shim/, CMakeLists.txt, patches/, dlss_bridge/, third_party/ (submódulos) third_party/LibAtrac9 (submódulo) tests/, tools/, docs/ (GPU), packaging/ (genérico), launcher/tlg_vulkan.py build.sh, run.sh, run.py, msys2-env.sh, shell.nix 

O CORE_MANIFEST é a lista exata do que é núcleo (globs, exclusões ! e submódulos @) e a fonte de verdade do core_sync.py. O CORE_SOURCE diz de qual commit de cada port veio cada parte. Os caminhos são iguais aos de um port, então comparar e copiar é direto. A raiz docs/ e tools/ são só deste repositório (não entram no manifesto).

Submódulos

fsr-vulkan, imgui, magic_enum, miniz, vulkan-headers, xbyak (em port/gpu/third_party/) e port/third_party/LibAtrac9, nos mesmos commits da main do inFAMOUS, com o .gitmodules nas URLs oficiais. Num clone novo: git submodule update --init (com rede) ou, offline, apontar submodule.<nome>.url para um checkout local e usar git -c protocol.file.allow=always submodule update --init.

O que é núcleo e o que é de cada jogo

Núcleo (ps4_core)De cada jogo (fica no port)
port/src/ menos o que está à direitaport/src/runtime_<slug>*.c: runtime_tlg.c, runtime_gr2*.c, runtime_infamous.c
import_names.inc (união de todos os jogos)port/src/game_<slug>.c: a tabela RuntimeGame (modelos em port/games/)
scripts de preparação e link, patches.py (o mecanismo)port/scripts/<slug>_patches.py (ex.: FPS do TLG)
GPU inteira (shadPS4 + shim), submódulosport/profile.ini: padrões do jogo (modelos em port/games/profile_<slug>.ini)
empacotamento genéricoport/packaging/port.env, icon/, README-player.md, windows/*.rc
tlg_vulkan.pyport/launcher/<slug>_*, <slug>_launcher.sh, run_<slug>.sh
ferramentas genéricas de scripts/scripts/<slug>_run.sh e roteiros de teste; README, docs/, CI, dump/, game/

import_names.inc é uma união. A tabela NID → nome não é só diagnóstico: o runtime_lookup resolve imports pelo nome, então um nome faltando é uma função que não liga, e uma entrada a mais não custa nada. Um jogo novo acrescenta as suas linhas aqui (gerar com scripts/sce_imports.py). O docs/LIBRARIES.md lista os nomes das tabelas que ainda não têm linha.

Como um port consome o núcleo

Hoje: cada port tem a sua cópia dos arquivos do manifesto, mantida em paralelo com o tools/core_sync.py (abaixo).

Plano:

  1. Submódulo em port/core (caminho local até existir um remoto). O build.sh e o CMakeLists.txt do port ficam finos: incluem core/port/gpu e compilam core/port/src/*.c + os src/runtime_<slug>*.c + src/game_<slug>.c do próprio port.
  2. Hooks do jogo por tabela (feito, branch feat/game-hooks): o runtime.c não cita mais jogo nenhum. Cada port define const RuntimeGame runtime_game em port/src/game_<slug>.c (port/src/runtime_game.h: slug, name, title_ids, env_prefix, profile, resolvers[] em ordem, init, patch_image, report). O build.sh (e o CMakeLists.txt no Windows) escolhe o arquivo: PORT_GAME=<slug>, senão o PORT_SLUG do port/packaging/port.env, senão o único src/game_*.c, senão src/game_none.c (build só do núcleo). Um jogo novo só precisa de src/game_<slug>.c (+ src/runtime_<slug>.c opcional), packaging/port.env e profile.ini. Detalhes e migração: docs/GAME_HOOKS.md.
  3. O que dois jogos usam subiu para o núcleo: event flags (runtime_eventflag.c) e as consultas de kernel, fuso horário, GetModuleInfoForUnwind, GetPrtAperture, HeapGetTraceInfo, DiscMap, LoadExec, PlayGo dialog e ErrorDialog (runtime_system.c), vindos do runtime_tlg.c e do runtime_gr2.c. Os ports apagam as cópias com port/games/migration/<port>.patch.
  4. Correções do núcleo são feitas aqui (ou num port e trazidas com core_sync.py --pull), e cada port atualiza o núcleo num PR próprio, testado no seu jogo.

Configuração em camadas: cada jogo continua configurável

#CamadaOnde ficaExemplos
1Padrões do núcleocódigo do núcleo (tlg_settings.cpp, runtime_*.c)o que vale quando ninguém disse nada
2Perfil do jogono port: port/packaging/port.env (identidade: nome, slug, título, ícone, PORT_ENV_PREFIX) + port/profile.ini (padrões)modo de readback, orçamento de VRAM (gc_budget_mb=3500 no inFAMOUS), block1d, skip de adjacência, patches de FPS, sensor e touchpad, mapa do mouse, upscaler
3Código do jogoruntime_<slug>*.c + game_<slug>.c + <slug>_patches.py, patches/*.xmlimports que só o jogo usa, correções no eboot
4Escolhas do jogadorlauncher e menu Insert, salvas por jogo: ~/.config/<slug>-launcher/settings.json e port/user/<TITLE_ID>/<prefixo>.ini (hoje port/user/tlg.ini)resolução, FPS, idioma, precisão da GPU, controles

Precedência: núcleo < perfil do jogo < jogador. Variáveis de ambiente valem por cima de tudo, só para testes (ISS_READBACKS=2 ./run_infamous.sh).

Carregador do perfil (feito, port/src/runtime_profile.c): genérico, não conhece jogo nenhum. No começo do main (depois do alias do prefixo) lê o profile.ini (TLG_PROFILE/<PREFIXO>PROFILE, senão o runtime_game.profile no diretório de trabalho, ao lado do executável ou um nível acima) e preenche cada TLG_* que o perfil define e que ninguém definiu antes. Como o launcher passa as escolhas do jogador por variável de ambiente: núcleo < profile.ini < launcher/jogador < ambiente. A seção [settings] dá padrões para chaves do tlg.ini (lida antes do tlg.ini do jogador). Chaves: tsc (host|process|auto), tsc_auto_threshold, readbacks, eager_readback, write_merge, gc_budget_mb, block1d, skip_adjacency, pipeline_binaries, mouse_buttons, motion_button, stick_deadzone, e [env] para qualquer outra TLG_X. Formato completo: docs/GAME_HOOKS.md.

Prefixo das variáveis de ambiente

Hoje o núcleo lê só TLG_ (herdado do primeiro port). Plano em duas etapas:

  1. Agora, um prefixo por jogo:TLG_ (The Last Guardian), GR2_ (Gravity Rush 2), ISS_ (inFAMOUS Second Son). O prefixo vem do runtime_game.env_prefix (game_infamous.c: "ISS_") ou, se o build tiver, do PORT_ENV_PREFIX="ISS_" no port/packaging/port.env, que tem prioridade; o build.sh passa -DPORT_ENV_PREFIX="ISS_" ao compilar o tlg-probe (no Windows, -DPORT_ENV_PREFIX=ISS_ ao CMake), e o alias_port_environment() do probe.c copia cada ISS_X para TLG_X no início do main (se TLG_X não estiver definido). Sem PORT_ENV_PREFIX (TLG, build só do núcleo) não há alias. Jogador, launcher e scripts usam o prefixo do jogo; o núcleo continua lendo TLG_X.
  2. Depois, um prefixo comum PSCORE_ para o que é do núcleo, quando todo port consumir o ps4_core: o carregador procura <PREFIXO>_X, PSCORE_X e por fim TLG_X, avisando uma vez no log quando usar o nome antigo (vem de runtime_game.env_prefix). Nomes internos (tlggpu, tlg-probe, TLG_SHADER_CACHE_KEY) não mudam agora.

Escolhas por jogo que ainda vivem no launcher

  • TSC: o padrão é o rdtsc do host com a frequência medida; TLG_TSC=process usa o relógio do processo (1 GHz, do upstream gow3_pc, para hosts com TSC diferente entre núcleos). Jogo que executa rdtsc direto no código (inFAMOUS: 391 sítios) tem de usar o do host, senão roda 3–4x rápido. tsc=auto no perfil (ou TLG_TSC=auto): o loader conta os 0F 31 no código do eboot preparado (fora dos módulos linkados) e escolhe host com 64 sítios ou mais (tsc_auto_threshold), process abaixo disso, e diz no log (TSC: auto: …). TLG 642, GR2 453, inFAMOUS 391 → host nos três, como hoje (KNOWN_ISSUES #15).
  • Readback antecipado + write merge (TLG_EAGER_READBACK=1, TLG_WRITE_MERGE=1): desligados no núcleo, ligados por padrão só no inFAMOUS. No fence a GPU já copia os buffers que o jogo lê de volta; escritas da CPU sem falta marcam essas cópias como velhas, para uma cópia antiga não sobrescrever bytes novos do jogo (#16).

Build

  • Build só do núcleo:cd port && flock -x <trava> env TLG_LTO=OFF bash build.sh --test compila o tlg-probe com src/game_none.c (sem hooks de jogo) e roda os testes de C (profile-test e eventflag-test incluídos). O empacotamento ainda precisa de port.env, ícone e .rc de um jogo.
  • Testar uma mudança do núcleo num jogo = levá-la ao port (com o game_<slug>.c dele) e compilar lá: cd <port>/port && flock -x <trava> env TLG_LTO=OFF bash build.sh (~5 min no primeiro build).
  • A biblioteca da GPU (cmake -S port/gpu) não depende dos arquivos do jogo no Linux.
  • Dependências: Vulkan, SDL3, FFmpeg (libavcodec/libavutil/libswscale), FreeType (o build.sh usa ../../tools/freetype-devel se o sistema não tiver), Zydis; Windows em MSYS2 CLANG64 (msys2-env.sh).
  • Cache de shaders:<saves>/cache/<TITLE_ID>-<chave> (a pasta --user do tlg-probe, port/user, igual em Linux e Windows; nunca a pasta ~/.local/share/shadPS4 do emulador shadPS4). O path_util.cpp escolhe a pasta no primeiro uso, depois do tlggpu_init definir TLG_GPU_USER_DIR; na primeira partida o cache_storage.cpp traz só a pasta <TITLE_ID>-<chave> atual do lugar antigo (~/.local/share/shadPS4/cache no Linux, user/user/cache no Windows) e apaga as outras chaves do jogo na pasta do port. Os pipeline binaries ficam dentro da pasta com chave. A chave (TLG_SHADER_CACHE_KEY) é o SHA-1 dos fontes do tradutor, calculado pelo CMake. Mesma versão do núcleo = mesma chave em todos os jogos; mudar o tradutor aqui gera chave nova e o cache velho é apagado sozinho. Um port não deve mexer no tradutor localmente.
  • Limpar o cache de shaders: botão Limpar cache de shaders no launcher, ou ./run_tlou.sh --clear-shader-cache (port/launcher/shader_cache.py: só o cache deste jogo, nunca saves, configurações ou logs).

Regras

  • Um jogo por vez, uma trava. O jogo nunca roda junto com um build, com o Ghidra ou com outra instância. Tudo passa pela trava exclusiva: flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock <comando>, incluindo builds e testes do ps4_core. Um build por vez (32 GB de RAM, /tmp é tmpfs), no máximo dois agentes. O core_sync.py e o list_exports.py só leem: não precisam da trava.
  • Nunca arquivos da Sony no git: eboot, prx, sprx, psarc, sfo, plt, arte oficial. Os link.json/analysis.json dos ports só são lidos pelo list_exports.py; nada deles é copiado.
  • Sem remoto, sem push. Os ports só recebem git fetch origin daqui (nunca push, nunca troca de branch).
  • Commits como HayatoG <[email protected]> com os trailers Co-Authored-By / Claude-Session (ver ~/decomp/REGRAS_AGENTES.md).

tools/core_sync.py

Compara por conteúdo os arquivos do CORE_MANIFEST com a cópia de um port:

tools/core_sync.py --status-all [--fetch] # tabela dos três ports contra origin/main tools/core_sync.py --ref origin/main ~/decomp/tlg_pc # lista os arquivos diferentes tools/core_sync.py --diff --ref origin/main ~/decomp/gr2_pc # com diff (ps4_core -> port) tools/core_sync.py --pull --ref origin/main ~/decomp/tlg_pc # traz o que o port tem de mais novo 

Estados: port-newer (a versão daqui está no histórico do port: o port andou), port-only, diverged (os dois mudaram: mesclar à mão), core-newer (a versão do port está no histórico daqui ou no commit fixado de um port do CORE_SOURCE: o port está atrás), core-only, submodule. O --pull copia port-newer e port-only (com --force, também diverged) só para o working tree: revise com git diff e faça o commit à mão, atualizando o CORE_SOURCE.

Estado em 14/10/2026 (--status-all, depois do sync com o inFAMOUS fd78ad5)

Portorigin/mainDiferentesLeva do portPort atrasado
tlg_pc639d6ce102073 core-newer + 29 core-only
gr2_pc4f5958f124081 core-newer + 43 core-only
infamous_pcfd78ad5 (PR #6)41025 core-newer + 16 core-only (SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX)

Nenhum port tem trabalho de núcleo que falte aqui. Para levar o núcleo a um port: copiar os arquivos core-newer/core-only numa branch do port, compilar e testar o jogo (com a trava), e abrir o PR.

Ferramentas

  • tools/list_exports.py -o docs/LIBRARIES.md: regenera o catálogo de bibliotecas (tabelas RuntimeExport, resolvers por NID, import_names.inc, LIB_FUNCTION da GPU, arquivos de cada jogo e os link.json dos ports). Rode depois de mexer num runtime_*.c.
  • scripts/sce_imports.py: imports de um eboot por biblioteca, para um jogo novo.

ps4_core — shared core of the PS4 native ports

Local-only repository. No GitHub, no remote, no push (for now). Everything a PS4 game needs to run natively on PC accumulates here; today it is copied into each port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) and infamous_pc (inFAMOUS Second Son, GitHub iss_pc).

By HayatoG · GPL-2.0-or-later · No Sony file goes in (eboot, prx, sprx, psarc, sfo, official art).

What it is

A native port runs the game's own executable (the decrypted eboot.bin from the player's dump) directly on the PC's x86-64 CPU. The core provides:

  1. Loader and linker (probe.c, link_modules.py, link_libc.py): map the eboot and the modules shipped with the game, relocate, bind every NID#library import to a host function, fix PC differences (fs:[0] → gs).
  2. HLE of the PS4 system libraries in C (port/src/runtime_*.c): libkernel, Pad, AudioOut, Ajm, SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, offline NpManager/Trophy, Http/Ssl/Net stubs, dialogs… Full per-function catalogue (real vs stub, which games use it): docs/LIBRARIES.md.
  3. GPU layer (port/gpu/): shadPS4 fork translating GCN command buffers (libSceGnmDriver) and shaders to Vulkan, plus VideoOut, AvPlayer and shim/ (SDL3 window, overlay, Insert menu, upscalers, post-processing).

Ports keep only their game: runtime_<slug>*.c, patches, profile, launcher, icon, docs.

Layout

See the tree above. CORE_MANIFEST lists what is core (include globs, ! excludes, @ submodules) and drives core_sync.py; CORE_SOURCE records which port commit each part came from. Paths under port/ and scripts/ are identical to a port repo; root docs/ and tools/ belong to ps4_core only. Submodules: same commits as infamous main, upstream URLs in .gitmodules.

Core vs per game

Per game: runtime_<slug>*.c, game_<slug>.c and profile.ini (templates in port/games/), <slug>_patches.py, port.env, icon, README-player.md, windows/*.rc, launchers, run/test scripts, README, docs, CI, dump/, game/. import_names.inc is a union of every game's imports (runtime_lookup resolves by name; a missing name is an unlinked function, an extra one costs nothing).

How ports consume it

Today each port carries a copy kept in step with tools/core_sync.py. Plan: (1) the core as a submodule at port/core, thin port build files; (2) done (branch feat/game-hooks): game hooks through the RuntimeGame table (port/src/runtime_game.h), defined by the port in src/game_<slug>.c; build.sh/CMake pick PORT_GAME, else PORT_SLUG from packaging/port.env, else the only src/game_*.c, else src/game_none.c (core-only build). A new game needs only src/game_<slug>.c (+ optional src/runtime_<slug>.c), port.env and profile.ini; (3) done: event flags (runtime_eventflag.c) and the shared kernel queries, time zone, unwind info, PRT aperture, heap trace, DiscMap, LoadExec, PlayGo dialog and ErrorDialog (runtime_system.c) moved out of runtime_tlg.c/runtime_gr2.c; ports drop their copies with port/games/migration/<port>.patch; (4) core fixes land here and each port bumps the core in its own tested PR. Details: docs/GAME_HOOKS.md.

Layered configuration

  1. Core defaults (core code). 2. Game profile (port.env identity + PORT_ENV_PREFIX, profile.ini defaults: readback mode, VRAM budget, block1d, skip-adjacency, FPS patches, motion/touchpad, mouse map, upscaler). 3. Game code (runtime_<slug>*.c, game_<slug>.c, patches). 4. Player choices (launcher and Insert menu, saved per game). Precedence: core < game profile < player; environment variables override everything, for testing only. Profile loader (done, port/src/runtime_profile.c), knowing no game: at the start of main it reads profile.ini (TLG_PROFILE, else runtime_game.profile in the working directory, next to the executable or one level up) and fills each TLG_* the profile sets and nobody set before, so core < profile.ini < launcher/player < environment; [settings] gives defaults for tlg.ini keys (read before the player's tlg.ini). Keys: tsc (host|process|auto), tsc_auto_threshold, readbacks, eager_readback, write_merge, gc_budget_mb, block1d, skip_adjacency, pipeline_binaries, mouse_buttons, motion_button, stick_deadzone, plus [env] for any other TLG_X.

Env prefix plan: now per game — TLG_ (The Last Guardian), GR2_ (Gravity Rush 2), ISS_ (inFAMOUS Second Son): the prefix comes from runtime_game.env_prefix ("ISS_" in game_infamous.c) or, overriding it, PORT_ENV_PREFIX="ISS_" in port/packaging/port.env, build.sh compiles tlg-probe with -DPORT_ENV_PREFIX="ISS_" (CMake option on Windows), and probe.calias_port_environment() copies each ISS_X to TLG_X at start unless TLG_X is set; no define = no alias. Later a common PSCORE_ prefix for core settings once every port consumes ps4_core (lookup <PREFIX>_X, PSCORE_X, then TLG_X, old name logged once). Internal names (tlggpu, tlg-probe, TLG_SHADER_CACHE_KEY) stay.

Per-game choices still in the launchers: TSC — host rdtsc with measured frequency by default, TLG_TSC=process for the process clock; games that execute rdtsc directly (inFAMOUS, 391 sites) must use the host rdtsc (profile tsc=auto counts 0F 31 in the prepared eboot's code at load and picks host at 64+ sites, logging it: TLG 642, GR2 453, inFAMOUS 391 → host, as today; KNOWN_ISSUES #15). Eager readback + write merge (TLG_EAGER_READBACK, TLG_WRITE_MERGE) are off in the core and on by default only in inFAMOUS; CPU writes merged without a fault mark the eager copies stale so an old copy never overwrites the game's new bytes (#16).

Build notes

Core-only build: cd port && flock -x <lock> env TLG_LTO=OFF bash build.sh --test links src/game_none.c and runs the C tests (packaging still needs a game's port.env, icon and .rc). To test a core change on a game, bring it into the port (with its game_<slug>.c) and build there under the lock. The GPU library (cmake -S port/gpu) does not need game files on Linux. Dependencies: Vulkan, SDL3, FFmpeg, FreeType, Zydis; Windows via MSYS2 CLANG64. Shader cache <saves>/cache/<TITLE_ID>-<key> (the probe's --user folder on Linux and Windows, never the shadPS4 emulator's ~/.local/share/shadPS4; the current key's folder is moved from the old location once, other keys are pruned), key = SHA-1 of the recompiler sources: same core, same key in every game; a recompiler change invalidates old caches automatically. The launcher's Clear shader cache button (or ./run_tlou.sh --clear-shader-cache) deletes only this game's cache.

Rules

  • One game at a time, one lock: the game never runs with a build, Ghidra or another instance; everything (ps4_core builds and tests included) goes through flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock; one build at a time; at most two agents. core_sync.py and list_exports.py only read and need no lock.
  • Never Sony files in git. The ports' link.json/analysis.json are only read by list_exports.py.
  • No remote, no push. Ports only get git fetch origin from here (never push, never a branch switch).
  • Commits as HayatoG <[email protected]> with the Co-Authored-By / Claude-Session trailers.

tools/core_sync.py

--status-all [--fetch] (table of the three ports vs origin/main), --ref, --diff, --pull (copies port-newer and port-only, plus diverged with --force, into the working tree for review). States: port-newer, port-only, diverged, core-newer (port behind; checked against this history and the pinned commits in CORE_SOURCE), core-only, submodule. Status on 2026-10-14 after the infamous_pc fd78ad5 sync: no port has core work missing here; tlg_pc 639d6ce 102 behind (73 core-newer, 29 core-only), gr2_pc 4f5958f 124 behind (81 + 43), infamous_pc fd78ad5 41 behind (25 + 16: SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX; inFAMOUS must add PORT_ENV_PREFIX="ISS_" to its port.env when it takes this core).

Tools

tools/list_exports.py -o docs/LIBRARIES.md regenerates the library catalogue; scripts/sce_imports.py lists a new game's imports per library.

About

No description, website, or topics provided.

Resources

Stars

15 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages