retroarch_read_memory
". Actually, the input text ends with "addresses you used on a different core / system…" and then the user's message is cut off. Actually, the user wrote "…" in the input. I need to translate the whole provided text, including the trailing "…".
Let me translate:
PURPOSE: Read up to 4096 bytes... -> НАЗНАЧЕНИЕ: Читает до 4096 байт из эмулируемой памяти через карту системной памяти ядра libretro (READ_CORE_MEMORY) и возвращает их в виде hex-dump.
Wait, the rule says descriptions of tools should be in 3rd person singular present indicative: "Читает", "Возвращает". So "PURPOSE: Read..." -> "НАЗНАЧЕНИЕ: Читает... и возвращает..."
USAGE: Preferred memory-read tool... -> ИСПОЛЬЗОВАНИЕ: Предпочтительный инструмент чтения памяти, когда загруженное ядро объявляет карту памяти (большинство современных ядер это делают). If it returns 'no memory map defined', fall back to retroarch_read_ram which uses the CHEEVOS address space. -> Если он возвращает 'no memory map defined', переключитесь на retroarch_read_ram, который использует адресное пространство CHEEVOS.
Need to be careful with "fall back" - could be "используйте как запасной вариант" or "переключитесь". Since it's an instruction to the user, imperative is fine. But the rules say for tool descriptions use 3rd person singular. However, here it's more of a usage instruction. The input text is a mix. Let me keep the imperative for usage instructions, as the original uses imperative "fall back", "pair", "batch". Actually, the rule says "Описания инструментов переводи глаголом в 3-м лице единственного числа" - descriptions of tools. This is a description of the tool's purpose and usage. Hmm.
Looking at the example: "Retrieves and queries up-to-date documentation..." - that's the tool description, in 3rd person. But "You must call 'Resolve Context7 Library ID' tool first..." - that's imperative/you must.
In this input, "PURPOSE: Read up to 4096 bytes..." - this is a description of what the tool does. So I should use "Читает" and "возвращает". For USAGE section, "Preferred memory-read tool..." is a statement. "If it returns... fall back to..." - this is an instruction to the user. I'll translate as "Если он возвращает... переключитесь на..." or "используйте как запасной вариант...". That's natural.
Let me translate section by section.
Original:
PURPOSE: Read up to 4096 bytes from emulated memory via the libretro core's system memory map (READ_CORE_MEMORY) and return them as a hex dump.
Translation:
НАЗНАЧЕНИЕ: Читает до 4096 байт из эмулируемой памяти через карту системной памяти ядра libretro (READ_CORE_MEMORY) и возвращает их в виде hex-dump.
Wait, "hex dump" - should I translate? It's a common term, often "дамп в шестнадцатеричном виде" or "hex-dump". I'll keep "hex-dump" as it's a technical term. Or "шестнадцатеричный дамп". Let me use "hex-dump" for brevity, but to be natural, "в виде hex-dump". Actually, "hex dump" is a standard term. I'll write "hex-dump".
USAGE: Preferred memory-read tool when the loaded core advertises a memory map (most modern cores do).
ИСПОЛЬЗОВАНИЕ: Предпочтительный инструмент чтения памяти, когда загруженное ядро объявляет карту памяти (большинство современных ядер так и делают).
If it returns 'no memory map defined', fall back to retroarch_read_ram which uses the CHEEVOS address space.
Если он возвращает 'no memory map defined', переключитесь на retroarch_read_ram, который использует адресное пространство CHEEVOS.
To poke a value back, pair with retroarch_write_memory at the same address.
Чтобы записать значение обратно, используйте retroarch_write_memory по тому же адресу.
"poke" is a technical term meaning to write a value directly to memory. "Записать значение" is fine.
The classic two-snapshot RAM-hunt workflow uses this: snapshot before a known change, snapshot after, diff for matching deltas.
Классический сценарий поиска значений в RAM по двум снимкам использует это: снимок до известного изменения, снимок после, поиск совпадающих дельт.
Hmm, "RAM-hunt" - "поиск в RAM". "two-snapshot" - "двухснимковый" or "по двум снимкам". Let me phrase: "Классический сценарий поиска в RAM с двумя снимками работает так: снимок до известного изменения, снимок после, сравнение для поиска совпадающих изменений."
Actually "diff for matching deltas" - "сравнение для поиска совпадающих изменений". Let me keep it natural.
Maximum 4096 bytes per call (NCI line-length limit); for larger reads, batch in 4 KiB chunks.
Максимум 4096 байт за вызов (ограничение длины строки NCI); для чтения больших объёмов разбивайте на фрагменты по 4 КиБ.
BEHAVIOR: No side effects — pure read.
ПОВЕДЕНИЕ: Побочных эффектов нет — чистое чтение.
Wait, "—" is a long dash. The rules say "Длинное тире «—» — используй дефис «-», запятую, двоеточие или точку." So I should not use a long dash. The original has "No side effects — pure read." I should use a colon or comma: "Побочных эффектов нет: чистое чтение." Or "Побочных эффектов нет, чистое чтение." Let me use a colon.
Transport: RetroArch's Network Control Interface (NCI) over UDP (default 127.0.0.1:55355, requires network_cmd_enable = true in retroarch.cfg).
Транспорт: сетевой интерфейс управления RetroArch (Network Control Interface, NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg).
Reads work whether emulation is paused or running.
Чтение работает и при паузе, и во время эмуляции.
Or "Чтение работает независимо от того, стоит ли эмуляция на паузе или идёт."
Returns an error if the loaded core doesn't expose a memory map ('no memory map defined'), the address is outside any core descriptor, length < 1, length > 4096, or the UDP query times out.
Возвращает ошибку, если загруженное ядро не предоставляет карту памяти ('no memory map defined'), адрес находится вне любого дескриптора ядра, длина < 1, длина > 4096, или UDP-запрос истёк по времени.
RetroArch may return FEWER bytes than requested if the read crosses a memory-region boundary — the response reports the actual count.
RetroArch может вернуть МЕНЬШЕ байт, чем запрошено, если чтение пересекает границу области памяти: ответ сообщает фактическое количество.
The original uses "—" before "the response reports". I'll use a colon.
RetroArch exposes TWO distinct memory APIs with different address spaces:
RetroArch предоставляет ДВА различных API памяти с разными адресными пространствами:
• READ_CORE_MEMORY / WRITE_CORE_MEMORY (used by retroarch_read_memory / retroarch_write_memory): goes through the libretro core's system memory map. Preferred when the loaded core advertises a memory map (most modern cores do). Errors with 'no memory map defined' if the loaded core doesn't.
• READ_CORE_MEMORY / WRITE_CORE_MEMORY (используются retroarch_read_memory / retroarch_write_memory): идут через карту системной памяти ядра libretro. Предпочтителен, когда загруженное ядро объявляет карту памяти (большинство современных ядер так и делают). Возвращает ошибку 'no memory map defined', если загруженное ядро её не предоставляет.
Hmm, "Errors with" - "Завершается ошибкой" or "Возвращает ошибку". Let me use "Возвращает ошибку".
• READ_CORE_RAM / WRITE_CORE_RAM (used by retroarch_read_ram / retroarch_write_ram): uses the achievement (CHEEVOS) address space. Works even when no core memory map is defined, but addresses follow CHEEVOS conventions, not the system bus. Use as a fallback when read_memory returns 'no memory map defined'.
• READ_CORE_RAM / WRITE_CORE_RAM (используются retroarch_read_ram / retroarch_write_ram): используют адресное пространство достижений (CHEEVOS). Работает, даже если карта памяти ядра не определена, но адреса следуют соглашениям CHEEVOS, а не системной шине. Используйте как запасной вариант, когда read_memory возвращает 'no memory map defined'.
Both APIs depend on the loaded core's exposed mapping — addresses you used on a different core / system…
Оба API зависят от карты, которую предоставляет загруженное ядро: адреса, которые вы использовали на другом ядре / системе…
The original ends with "…" and then the user message ends. I'll include the ellipsis as in the original.
Now, let me refine the translation to sound natural, avoid AI clichés, no long dash.
Check for forbidden phrases:
- "данный" - avoid
- "является" - avoid
- "представляет собой" - avoid
- "стоит отметить" - avoid
- "важно понимать" - avoid
- "в современном мире" - avoid
- "играет ключевую роль" - avoid
- "позволяет осуществить" - avoid
- "обеспечивает возможность" - avoid
- "не просто X, а Y" - avoid
- "не только X, но и Y" - avoid
- "таким образом" - avoid
- "подводя итог" - avoid
- "мощный инструмент" - avoid
- "открывает новые горизонты" - avoid
- "выводит на новый уровень" - avoid
- "может стать" - avoid
- "способен обеспечить" - avoid
- "призван решить" - avoid
Also no long dash "—". Use ":" or "," instead.
Now, let me rewrite the whole translation.
One more thing: "libretro core" - I'll keep "ядро libretro" or "libretro-ядро". "Core" is a technical term, often left as "core" in Russian RetroArch communities. But "ядро" is a common translation. I'll use "ядро libretro" for clarity, but keep "core" in parentheses maybe? The original says "libretro core's system memory map". I'll translate as "карта системной памяти ядра libretro".
"hex dump" - "hex-dump" is understandable. Or "шестнадцатеричный дамп". Let me use "hex-dump" as a technical term.
"RAM-hunt" - "поиск в RAM". "two-snapshot" - "по двум снимкам". I'll write: "Классический сценарий поиска в RAM по двум снимкам использует это: снимок до известного изменения, снимок после, сравнение для поиска совпадающих дельт."
Actually, "diff for matching deltas" - "сравнивает, чтобы найти совпадающие изменения". Let me phrase more naturally: "Классический сценарий поиска в RAM по двум снимкам работает так: делаете снимок до известного изменения, снимок после, сравниваете и ищете совпадающие изменения."
But the original is terse and technical. I'll keep it terse: "снимок до известного изменения, снимок после, сравнение для поиска совпадающих дельт." That's fine.
"batch in 4 KiB chunks" - "разбивайте на фрагменты по 4 КиБ" or "грузите фрагментами по 4 КиБ". I'll say "разбивайте на фрагменты по 4 КиБ".
"line-length limit" - "ограничение длины строки". NCI is a text-based protocol, so line length matters. Good.
"Reads work whether emulation is paused or running." - "Чтение работает и на паузе, и во время эмуляции." Or "Чтение работает независимо от того, стоит ли эмуляция на паузе или запущена."
"Returns an error if the loaded core doesn't expose a memory map ('no memory map defined'), the address is outside any core descriptor, length < 1, length > 4096, or the UDP query times out." - I'll keep the list: "Возвращает ошибку, если загруженное ядро не предоставляет карту памяти ('no memory map defined'), адрес находится вне любого дескриптора ядра, длина < 1, длина > 4096, или UDP-запрос превысил время ожидания."
"RetroArch may return FEWER bytes than requested if the read crosses a memory-region boundary — the response reports the actual count." - "RetroArch может вернуть МЕНЬШЕ байт, чем запрошено, если чтение пересекает границу области памяти: в ответе сообщается фактическое количество."
The emphasis on FEWER should be preserved: МЕНЬШЕ.
"RetroArch exposes TWO distinct memory APIs" - "RetroArch предоставляет ДВА различных API памяти". Emphasis on TWO: ДВА.
Now, the bullet points. I need to keep the bullet symbol "•".
Let me also handle "used by retroarch_read_memory / retroarch_write_memory" - "используются в retroarch_read_memory / retroarch_write_memory" or "используются инструментами retroarch_read_memory / retroarch_write_memory". I'll say "используются в retroarch_read_memory / retroarch_write_memory".
Actually, "READ_CORE_MEMORY / WRITE_CORE_MEMORY (used by retroarch_read_memory / retroarch_write_memory)" - these are the command names used by the corresponding functions. So "используются командами retroarch_read_memory / retroarch_write_memory" or just "используются в...". I'll say "используются в retroarch_read_memory / retroarch_write_memory".
Let me check "Errors with 'no memory map defined' if the loaded core doesn't." - "Завершается ошибкой 'no memory map defined', если загруженное ядро этого не делает." To avoid repetition, "если загруженное ядро не предоставляет карту памяти."
Now, "Both APIs depend on the loaded core's exposed mapping — addresses you used on a different core / system…" - "Оба API зависят от карты, которую предоставляет загруженное ядро: адреса, которые вы использовали на другом ядре / системе…"
The original has a trailing ellipsis, so I'll keep it.
Let me assemble the full translation.
Final check: no long dash. I used ":" and "," instead. Good.
I'll write the translation now.НАЗНАЧЕНИЕ: Читает до 4096 байт из эмулируемой памяти через карту системной памяти ядра libretro (READ_CORE_MEMORY) и возвращает их в виде hex-dump. ИСПОЛЬЗОВАНИЕ: Предпочтительный инструмент чтения памяти, когда загруженное ядро объявляет карту памяти (большинство современных ядер так и делают). Если он возвращает 'no memory map defined', переключитесь на retroarch_read_ram, который использует адресное пространство CHEEVOS. Чтобы записать значение обратно, используйте retroarch_write_memory по тому же адресу. Классический сценарий поиска в RAM по двум снимкам работает так: снимок до известного изменения, снимок после, сравнение для поиска совпадающих дельт. Максимум 4096 байт за вызов (ограничение длины строки NCI); для чтения больших объёмов разбивайте на фрагменты по 4 КиБ. ПОВЕДЕНИЕ: Побочных эффектов нет: чистое чтение. Транспорт: сетевой интерфейс управления RetroArch (Network Control Interface, NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). Чтение работает и на паузе, и во время эмуляции. Возвращает ошибку, если загруженное ядро не предоставляет карту памяти ('no memory map defined'), адрес находится вне любого дескриптора ядра, длина < 1, длина > 4096, или UDP-запрос превысил время ожидания. RetroArch может вернуть МЕНЬШЕ байт, чем запрошено, если чтение пересекает границу области памяти: в ответе сообщается фактическое количество.
RetroArch предоставляет ДВА различных API памяти с разными адресными пространствами:
• READ_CORE_MEMORY / WRITE_CORE_MEMORY (используются в retroarch_read_memory / retroarch_write_memory): идут через карту системной памяти ядра libretro. Предпочтительны, когда загруженное ядро объявляет карту памяти (большинство современных ядер так и делают). Возвращают ошибку 'no memory map defined', если загруженное ядро её не предоставляет.
• READ_CORE_RAM / WRITE_CORE_RAM (используются в retroarch_read_ram / retroarch_write_ram): используют адресное пространство достижений (CHEEVOS). Работают, даже если карта памяти ядра не определена, но адреса следуют соглашениям CHEEVOS, а не системной шине. Используйте как запасной вариант, когда read_memory возвращает 'no memory map defined'.
Оба API зависят от карты, которую предоставляет загруженное ядро: адреса, которые вы использовали на другом ядре / системе…