dmang-dev/mcp-retroarch

dmang-dev/mcp-retroarch

от dmang-dev
MCP-сервер для управления RetroArch через его сетевой интерфейс: читает и пишет память эмуляции, управляет сохранениями, делает скриншоты, ставит паузу и сбрасывает игру. Подходит для автоматизации...

mcp-retroarch

npm version npm downloads CI License: MIT Snyk Socket Bundlephobia npmgraph

An MCP server that bridges Claude (and any other MCP client) to RetroArch via its built-in Network Control Interface (UDP, port 55355).

Works against any libretro core (NES, SNES, Genesis, GB/GBC/GBA, PSX, N64, etc.) — give the model memory r/w, save-state automation, screenshot, pause / frame-advance / reset, and on-screen messages.

What it can do

Capability Available? Notes
Memory read / write ✅ Two paths: READ_CORE_MEMORY (system memory map, preferred) and READ_CORE_RAM (CHEEVOS, fallback)
Save / load state ✅ Current slot or explicit slot for load; save is current-slot-only (NCI limitation)
Screenshot ✅ Saved to RetroArch's configured screenshot directory
Pause / frame advance ✅ PAUSE_TOGGLE flips state; FRAMEADVANCE steps one frame
Reset ✅ Hard-reset the running game
On-screen message ✅ Useful for "look here" cues during scripted runs
Game info ✅ Title, system, CRC32
Game-pad input ❌ NCI doesn't expose this. RetroArch has a separate "Remote RetroPad" core on UDP port 55400 that does, but it requires loading that specific core (you can't drive an existing emulation core through it). Not in scope for v0.1.0.
Инструменты были проиндексированы:
retroarch_frame_advance

НАЗНАЧЕНИЕ: Продвигает эмуляцию ровно на один кадр. ИСПОЛЬЗОВАНИЕ: Применяется для автоматизации ввода с точностью до кадра, просмотра анимации или инициализации системы после сброса. ДЕЙСТВУЕТ только когда эмуляция на паузе: команда FRAMEADVANCE в RetroArch ничего не делает, когда эмуляция запущена, поэтому сначала вызовите retroarch_pause_toggle (предварительно проверив retroarch_get_status, чтобы убедиться, что в итоге будет пауза, а не запуск). Для длинных переходов (тысячи кадров) предпочтительнее использовать retroarch_save_state_current / retroarch_load_state_current с заранее подготовленным состоянием: покадровое продвижение стоит примерно один UDP-запрос на кадр. ПОВЕДЕНИЕ: На паузе продвигает эмулятор ровно на один кадр и остаётся на паузе. Если паузы нет, RetroArch молча игнорирует команду. ОТПРАВИЛ-И-ЗАБЫЛ: NCI НЕ подтверждает эту команду: вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно используйте инструмент наблюдения (retroarch_get_status для состояния выполнения, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, адресованные RetroArch, который не слушает порт, молча отбрасываются. Новое значение счётчика кадров не сообщается: чтобы убедиться в продвижении, сделайте скриншоты до и после с помощью retroarch_screenshot или прочитайте заведомо изменяющееся значение памяти. Транспорт: интерфейс Network Control Interface (NCI) в RetroArch через UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Одну строку 'Advanced one frame' (только подтверждение отправки UDP, НЕ подтверждает, что RetroArch был на паузе или что кадр действительно продвинулся).

Параметры

Без параметров.

retroarch_get_config

НАЗНАЧЕНИЕ: Читает один параметр конфигурации RetroArch по имени через команду NCI GET_CONFIG_PARAM. ИСПОЛЬЗОВАНИЕ: Узнаёт пути файловой системы RetroArch и выбранные настройки без самостоятельного разбора retroarch.cfg. Для состояния выполнения (запущено/на паузе, загруженный ROM) используйте вместо этого retroarch_get_status. Этот инструмент читает только статическую конфигурацию. RetroArch заносит в белый список доступные параметры; имена не из белого списка вызывают ошибку, даже если они есть в retroarch.cfg. screenshot_directory НЕ доступен. См. retroarch_screenshot. ПОВЕДЕНИЕ: Побочных эффектов нет. Только чтение. Транспорт: сетевой интерфейс управления RetroArch (NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). Вызывает ошибку, если параметра нет в белом списке NCI RetroArch, если значение содержит символы, ломающие построчный разбор ответа (редкий случай: встроенные переводы строк или нулевые байты), или если истёк таймаут UDP-запроса. ВОЗВРАЩАЕТ: 'NAME = VALUE', где VALUE - значение в том виде, в каком оно хранится в retroarch.cfg (пути без кавычек, логические значения как 'true'/'false', целые числа в десятичном виде).

Параметры
  • namestringобязательный

    Ключ конфигурации - тот же идентификатор в snake_case ASCII, который RetroArch использует в retroarch.cfg, регистрозависимый, без кавычек вокруг. Ключи класса путей (возвращают абсолютные пути на диске): savefile_directory, savestate_directory, system_directory, cache_directory, log_dir, runtime_log_directory, core_assets_directory. Ключи пользовательских данных: netplay_nickname. Ключи-переключатели (возвращают 'true' / 'false'): video_fullscreen, video_vsync, audio_mute_enable. Полный белый список зависит от сборки RetroArch; если ключ возвращает ошибку вместо значения, значит в этой сборке он не выставлен наружу через NCI. Примечательные исключения: screenshot_directory RetroArch намеренно НЕ отдаёт (обходной путь см. в retroarch_screenshot). Также нет ключа для текущего выбранного слота сохранений - отслеживайте его на стороне клиента через retroarch_state_slot_plus/minus.

retroarch_get_status

НАЗНАЧЕНИЕ: Сообщает, воспроизводит ли RetroArch в данный момент или стоит на паузе, а также загруженную систему, базовое имя игры и CRC32. ИСПОЛЬЗОВАНИЕ: Вызывайте после retroarch_ping, чтобы узнать, что (если вообще что-то) загружено; перед retroarch_pause_toggle, чтобы решить, поставит ли переключатель на паузу или снимет с неё; перед retroarch_frame_advance (который делает шаг только на паузе); всякий раз, когда нужно подтвердить, что предыдущая команда в стиле «выстрелил и забыл» (pause/reset/load_state) действительно сработала. Для настроек RetroArch (пути, флаги) используйте retroarch_get_config: этот инструмент сообщает только состояние выполнения и идентификацию загруженного ПЗУ. ПОВЕДЕНИЕ: Побочных эффектов нет: это просто чтение статуса эмулятора через команду GET_STATUS в NCI. Возвращает 'No content loaded' (state=contentless), когда RetroArch находится в меню без ПЗУ. Возвращает ошибку при тайм-ауте UDP (RetroArch недоступен). ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Когда контент загружен: четыре строки 'State: playing|paused', 'System: SYSTEM_ID', 'Game: BASENAME', 'CRC32: HEX or (none reported)'. Когда контента нет: буквально 'No content loaded'.

Параметры

Без параметров.

retroarch_load_state_current

НАЗНАЧЕНИЕ: Восстанавливает состояние эмулятора из выбранного в данный момент слота сохранения RetroArch (один из слотов 0-9). ИСПОЛЬЗОВАНИЕ: Парный инструмент к retroarch_save_state_current. Используйте, чтобы отменить последовательность записей/вводов (рабочий процесс снимок/эксперимент/восстановление) или начать каждую последовательность вызовов инструментов с известной отправной точки. Загружает из того слота, который выбран в данный момент (того же, на который нацелился бы save_state_current). Чтобы загрузиться из конкретного слота, НЕ меняя указатель текущего слота, используйте вместо этого retroarch_load_state_slot: это важно, если вы переключаетесь между закладками. Чтобы начать заново с момента запуска, используйте retroarch_reset. ПОВЕДЕНИЕ: РАЗРУШИТЕЛЬНО ДЛЯ ТЕКУЩЕГО СОСТОЯНИЯ: заменяет ВСЁ текущее состояние эмулятора (ОЗУ, регистры, маппер, аудио, номер кадра) содержимым файла слота. Всё, что не было сохранено в снимке ранее, теряется. Файл состояния ОБЯЗАН происходить из того же ROM и той же версии ядра, которые его создали: загрузка несовместимых файлов обычно завершается ошибкой или дестабилизирует ядро. ОТПРАВИЛ И ЗАБЫЛ: NCI НЕ подтверждает эту команду: вызов возвращается, как только UDP-датаграмма отправлена, без подтверждения того, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно вызовите инструмент наблюдения (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, направленные в RetroArch, который не слушает порт, молча отбрасываются. Если в выбранном в данный момент слоте нет сохранённого состояния, RetroArch молча игнорирует команду: ошибка не возникает. Чтобы убедиться, что загрузка произошла, дополнительно выполните чтение памяти или сделайте скриншот. ТРАНСПОРТ: сетевой интерфейс управления (NCI) RetroArch поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: одну строку 'Loaded from current slot' (только подтверждение отправки по UDP: НЕ проверяет, существовал ли слот и удалась ли загрузка).

Параметры

Без параметров.

retroarch_load_state_slot

НАЗНАЧЕНИЕ: Загружает состояние из явно указанного номера слота сохранения, не изменяя указатель текущего слота RetroArch. ИСПОЛЬЗОВАНИЕ: Используйте для загрузки из конкретного слота, когда не нужно затрагивать указатель текущего слота (например, вы переключаетесь между двумя закладками, сохраняя «активный» слот для текущих сохранений). Для загрузки из текущего выбранного слота используйте retroarch_load_state_current: семантически это разные вещи: данный инструмент полностью игнорирует указатель текущего слота и обращается по номеру. По соглашению RetroArch слоты нумеруются от 0 до 9. В NCI нет аналога retroarch_save_state_slot: сохранение в конкретный слот по-прежнему требует перебора указателя с помощью state_slot_plus/minus с последующим вызовом save_state_current. ПОВЕДЕНИЕ: ОПАСНО ДЛЯ ТЕКУЩЕГО СОСТОЯНИЯ: заменяет ВСЕ текущее состояние эмулятора содержимым указанного слота. Всё, что не было сохранено заранее, будет потеряно. Файл состояния ОБЯЗАТЕЛЬНО должен быть создан той же ROM и той же версией ядра, которые его породили. Транспорт: Network Control Interface (NCI) RetroArch поверх UDP (по умолчанию 127.0.0.1:55355, требуется network_cmd_enable = true в retroarch.cfg). В ОТЛИЧИЕ от большинства управляющих команд NCI, LOAD_STATE_SLOT отправляет ответ (этот клиент ожидает его), поэтому таймаут UDP проявится здесь как ошибка, хотя родственные команды загрузки/сохранения работают по принципу «отправил и забыл». Если в указанном слоте нет сохранённого состояния, ответ RetroArch всё равно сообщит, что команда обработана: проверьте через чтение памяти или скриншот. Указатель текущего слота после этого вызова не изменяется. ВОЗВРАЩАЕТ: Одна строка 'Loaded from slot N', повторяющая запрошенный номер слота.

Параметры
  • slotintegerобязательный

    Номер слота сохранения состояния, из которого загружать. Стандартный диапазон слотов RetroArch - 0-9 (десять слотов), но NCI не задаёт жёсткой верхней границы: номера слотов вне настроенного диапазона просто не найдут файл и молча ничего не сделают. Этот вызов НЕ меняет указатель текущего выбранного слота (для этого используйте retroarch_state_slot_plus / retroarch_state_slot_minus).

retroarch_pause_toggle

НАЗНАЧЕНИЕ: Переключает состояние паузы RetroArch: ставит на паузу, если игра запущена, и снимает с паузы, если она на паузе. ИСПОЛЬЗОВАНИЕ: NCI RetroArch предоставляет ТОЛЬКО переключатель, отдельных команд паузы/возобновления нет. Чтобы состояние стало известным, сначала вызовите retroarch_get_status и проверьте state: playing|paused, затем переключайте только в том случае, если нужно его изменить. Используйте перед последовательностью вызовов memory-inspect / write / screenshot, когда нужно стабильное состояние игры между вызовами; сочетайте с retroarch_frame_advance, чтобы переходить по одному кадру, не выходя из паузы. ПОВЕДЕНИЕ: Изменяет состояние выполнения эмулятора, переключая его. ОТПРАВИЛ И ЗАБЫЛ: NCI НЕ подтверждает эту команду: вызов возвращается сразу после отправки UDP-дейтаграммы, без подтверждения того, что RetroArch получил или применил её. Чтобы проверить эффект, воспользуйтесь наблюдаемым инструментом (retroarch_get_status для состояния выполнения, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, отправленные в RetroArch, который не слушает порт, молча отбрасываются. Вызов toggle, когда вы не знаете текущее состояние, переключит его в то состояние, в котором он НЕ находится. Если это важно, подтвердите с помощью retroarch_get_status до и после. ТРАНСПОРТ: Сетевой интерфейс управления RetroArch (NCI) через UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Строку 'Pause toggled' (это подтверждение того, что UDP-дейтаграмма отправлена, а НЕ того, что RetroArch получил или выполнил её).

Параметры

Без параметров.

retroarch_ping

НАЗНАЧЕНИЕ: Проверяет связь с Network Control Interface в RetroArch и возвращает строку версии запущенного RetroArch. ИСПОЛЬЗОВАНИЕ: Вызывается один раз в начале сеанса перед вызовом других инструментов - если вызов успешен, UDP-транспорт работает, и другие инструменты смогут достучаться до RetroArch. После этого необходимо вызвать retroarch_get_status, чтобы подтвердить, что игра загружена (ping проходит, даже когда RetroArch находится в меню без загруженного контента). ПОВЕДЕНИЕ: Без побочных эффектов - чистая проверка доступности. Транспорт: Network Control Interface (NCI) RetroArch через UDP (по умолчанию 127.0.0.1:55355, требуется network_cmd_enable = true в retroarch.cfg). Тайм-аут наступает примерно через 5 секунд с понятной ошибкой, если RetroArch не запущен, у него отключены сетевые команды, он привязан к другому хосту/порту или брандмауэр блокирует UDP 55355. ВОЗВРАЩАЕТ: Одну строку вида 'OK - RetroArch VERSION', например 'OK - RetroArch 1.20.0'.

Параметры

Без параметров.

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 зависят от карты, которую предоставляет загруженное ядро: адреса, которые вы использовали на другом ядре / системе…

Параметры
  • addressintegerобязательный

    Начальный адрес в карте системной памяти ядра libretro (НЕ адресное пространство CHEEVOS - это read_ram). Схема адресов зависит от загруженного ядра: например, SNES WRAM обычно находится по адресам 0x7E0000-0x7FFFFF, GBA EWRAM - по 0x02000000-0x0203FFFF, Genesis 68K RAM - по 0xFF0000-0xFFFFFF. Читает length последовательных байтов, начиная с этого адреса.

  • lengthintegerобязательный

    Количество последовательных байтов для чтения (1-4096). Жёсткий предел: размер одиночной датаграммы NCI в RetroArch; чтения большего размера разбивайте на части самостоятельно. RetroArch может вернуть меньше байтов, если чтение пересекает границу региона памяти в списке дескрипторов ядра.

retroarch_read_ram

ЦЕЛЬ: Читает до 4096 байт из эмулируемой памяти через адресное пространство достижений (CHEEVOS) (READ_CORE_RAM) и возвращает их в виде hex-дампа. ИСПОЛЬЗОВАНИЕ: Запасной инструмент чтения памяти: применяйте, когда retroarch_read_memory возвращает «no memory map defined» (старые ядра или ядра без открытой карты системной памяти всё ещё могут отвечать через старый API чтения CHEEVOS). Чтобы записать данные обратно, используйте вместе с retroarch_write_ram по тому же адресу CHEEVOS. Максимум 4096 байт за вызов (ограничение длины строки NCI). ПОВЕДЕНИЕ: Побочных эффектов нет, только чтение. Транспорт: сетевой интерфейс управления RetroArch (NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требуется network_cmd_enable = true в retroarch.cfg). Чтение работает и на паузе, и при запущенной эмуляции. Возвращает ошибку, если адрес недействителен для пространства CHEEVOS, длина < 1, длина > 4096 или истёк таймаут UDP-запроса. Как и read_memory, 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 зависят от предоставляемой загруженным ядром карты: адреса, которые вы использовали на другом ядре или системе, НЕ переносятся. ВОЗВРАЩАЕТ: Строка заголовка 'ADDR_HEX [N bytes, CHEEVOS]:', за которой следуют разделённые пробелами двухзначные шестнадцатеричные байты в верхнем регистре.

Параметры
  • addressintegerобязательный

    Начальный адрес в адресном пространстве CHEEVOS (достижения), отличном от карты системной памяти libretro, которую использует retroarch_read_memory. Адреса CHEEVOS подчиняются соглашениям для каждой системы, принятым в RetroAchievements (например, адреса CHEEVOS для WRAM на SNES начинаются с 0x000000, а не с адреса системной шины SNES 0x7E0000). Если не уверены, обычно лучше начать с retroarch_read_memory.

  • lengthintegerобязательный

    Число последовательных байтов для чтения (1-4096). Жёсткий предел - размер одного датаграмма NCI в RetroArch. На границах региона может вернуть меньше байтов.

retroarch_reset

НАЗНАЧЕНИЕ: Мягко сбрасывает запущенную игру - эквивалентно нажатию кнопки сброса на консоли (НЕ полному циклу питания). ИСПОЛЬЗОВАНИЕ: Используется для запуска заново с вектора сброса игры. Для возврата к конкретной заведомо исправной точке вместо загрузки используются retroarch_load_state_current или retroarch_load_state_slot с ранее сохранённым состоянием. Это МЯГКИЙ сброс (сброс кнопкой): содержимое ОЗУ и внутреннее состояние картриджа могут сохраняться в зависимости от системы, в отличие от полного цикла питания. ПОВЕДЕНИЕ: РАЗРУШАЮЩЕЕ: запускает процедуру сброса загруженного ядра, которая на большинстве систем очищает регистры, сбрасывает PC в вектор сброса и начинает последовательность загрузки заново. Несохранённый игровой прогресс теряется. Загруженный ROM остаётся загруженным: затрагивается только энергозависимое состояние. БЕЗ ПОДТВЕРЖДЕНИЯ: NCI НЕ подтверждает эту команду - вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения того, что RetroArch получил или применил её. Эффект проверяется с помощью наблюдаемого инструмента (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). Если RetroArch не прослушивает порт, UDP-пакеты молча отбрасываются. Для подтверждения сброса используется retroarch_get_status (состояние должно оставаться 'playing') и/или скриншот. ТРАНСПОРТ: Сетевой интерфейс управления RetroArch (NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Одну строку 'Game reset' (только подтверждение отправки UDP - НЕ проверяет, что сброс выполнен).

Параметры

Без параметров.

retroarch_save_state_current

НАЗНАЧЕНИЕ: Сохраняет полное состояние эмулятора в текущий выбранный слот RetroArch (один из слотов 0-9). ИСПОЛЬЗОВАНИЕ: Используйте как точку отката перед рискованными записями, чтобы помечать интересные состояния игры или делиться репро-состояниями. В NCI RetroArch НЕТ команды 'save to slot N' - чтобы выбрать конкретный слот, сначала нужно переместить указатель слота командами retroarch_state_slot_plus / retroarch_state_slot_minus, затем вызвать этот инструмент. Текущий слот - внутреннее состояние RetroArch, и NCI его НЕ сообщает, поэтому если вы не отслеживаете его сами, следите за индикатором слота на экране после каждой команды plus/minus или используйте retroarch_show_message в качестве эхо-подтверждения. Сопутствующая команда retroarch_load_state_current восстанавливает состояние из того же слота. Для сохранения и загрузки сейвов по пути (без слотов) в NCI аналога нет - используйте серверы BizHawk или mGBA MCP. ПОВЕДЕНИЕ: ОПАСНО ДЛЯ ФАЙЛА ЦЕЛЕВОГО СЛОТА: перезаписывает то, что было в текущем слоте, без запроса и резервной копии. Файл состояния попадает в директорию savestate_directory, заданную в конфигурации RetroArch (её можно узнать через retroarch_get_config). Файлы состояний привязаны к ТОЧНОЙ ROM и версии ядра, которые их создали - загрузка на другой ROM или другое ядро обычно завершается ошибкой. ОТПРАВИЛ И ЗАБЫЛ: NCI НЕ подтверждает эту команду - вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно используйте инструмент, который даёт видимый ответ (retroarch_get_status для состояния выполнения, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты в неслушающий RetroArch молча отбрасываются. Чтобы убедиться, что сохранение произошло, загрузите состояние обратно через retroarch_load_state_current и проверьте чтением памяти или скриншотом. ТРАНСПОРТ: сетевой интерфейс управления RetroArch (NCI) через UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: одну строку 'Saved to current slot' (только подтверждение отправки UDP - не проверяет файл…

Параметры

Без параметров.

retroarch_screenshot

Назначение: Создаёт PNG-скриншот текущего изображения эмулятора и сохраняет его в настроенный каталог скриншотов RetroArch. Использование: применяется для захвата видимого состояния игры с целью проверки, документирования последовательности действий или подтверждения того, что управляющая команда (пауза / сброс / load_state / write), отправленная без ожидания ответа, дала видимый результат. Чтобы снять конкретное состояние игры, сначала поставьте на паузу / прокрутите кадры / загрузите состояние, чтобы получить нужный кадр, и только затем вызывайте этот инструмент. ВАЖНО: в отличие от большинства инструментов создания скриншотов, этот НЕ принимает аргумент пути — RetroArch сохраняет файл в свой собственный настроенный screenshot_directory, который NCI не раскрывает (его НЕЛЬЗЯ прочитать через retroarch_get_config). Чтобы найти файл, проверьте интерфейс настроек RetroArch (Settings → Directory → Screenshots) или посмотрите, куда обычно сохраняются скриншоты в вашей сборке. ПОВЕДЕНИЕ: Записывает новый PNG с временной меткой в каталог скриншотов RetroArch — существующие файлы не перезаписываются (RetroArch генерирует новое имя файла для каждого снимка). БЕЗ ПОДТВЕРЖДЕНИЯ: NCI НЕ подтверждает выполнение этой команды — вызов возвращается сразу после отправки UDP-датаграммы, без какого-либо подтверждения того, что RetroArch получил или применил её. Чтобы убедиться в результате, воспользуйтесь наблюдаемым инструментом (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, отправленные в неслушающий RetroArch, молча игнорируются. Возвращаемое сообщение подтверждает только то, что команда SCREENSHOT была отправлена, а не то, что файл действительно записан (переполнение диска, отказ в доступе и т.п. останутся незамеченными с точки зрения инструмента). Транспорт: Сетевой интерфейс управления RetroArch (NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Одну строку 'Screenshot saved to RetroArch's configured screenshot directory' (только подтверждение отправки по UDP).

Параметры

Без параметров.

retroarch_show_message

НАЗНАЧЕНИЕ: отображает однострочное уведомление поверх окна RetroArch (OSD). ИСПОЛЬЗОВАНИЕ: для отладочного вывода внутри эмулятора, маркеров прогресса во время длинных скриптов или текста для человека, наблюдающего за окном RetroArch. Чисто косметическая функция, на состояние игры не влияет. ЕДИНСТВЕННЫЙ способ вывести текст, созданный агентом, на дисплей RetroArch; обратного чтения с экрана не существует. ПОВЕДЕНИЕ: отображает сообщение в области уведомлений RetroArch примерно на 3 секунды (стандартная задержка уведомлений RetroArch, настраивается через семейство параметров input_overlay_show_inputs_port). Сообщения НЕ ставятся в очередь: быстрые вызовы заменяют предыдущее сообщение раньше, чем пользователь успеет его прочитать. ОТПРАВИЛ-И-ЗАБЫЛ: NCI НЕ подтверждает эту команду: вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения того, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно используйте наблюдаемый инструмент (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, отправленные в RetroArch, который не слушает порт, молча отбрасываются. ТРАНСПОРТ: сетевой управляющий интерфейс RetroArch (NCI) поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: 'Showed: MESSAGE' с эхом отправленного (подтверждение только отправки UDP, не проверяет, отобразилось ли уведомление).

Параметры
  • messagestringобязательный

    Текст сообщения в UTF-8. Пробелы и большинство знаков пунктуации сохраняются как есть. ПЕРЕВОДЫ СТРОК (\n / \r) ОБРЕЗАЮТ сообщение: протокол NCI завершает строку, поэтому всё после первого перевода строки молча отбрасывается при передаче. Держите сообщения в ОДНУ СТРОКУ; рекомендуемая длина ≤80 символов, чтобы уместиться в оверлей уведомлений RetroArch без обрезки по горизонтали (точная ширина зависит от разрешения видео и размера шрифта у пользователя). Последовательные вызовы ЗАМЕНЯЮТ друг друга, а не встают в очередь, поэтому используйте одно сообщение на логическое событие вместо того чтобы выдавать поток обновлений статуса. Спецсимволы: знаки процента безопасны (RetroArch НЕ интерпретирует строку через printf), кавычки безопасны (оболочка не подставляет значения), но управляющие байты ASCII, кроме пробела, скорее всего отобразятся квадратиками или будут вырезаны.

retroarch_state_slot_minus

НАЗНАЧЕНИЕ: Уменьшает указатель текущего выбранного слота сохранения RetroArch на 1 (например, слот 3 → слот 2). ИСПОЛЬЗОВАНИЕ: Парный инструмент к retroarch_state_slot_plus. Сочетайте с retroarch_save_state_current или retroarch_load_state_current, чтобы нацелиться на слот с меньшим номером. Эти инструменты всегда работают с текущим слотом. NCI RetroArch не предоставляет НИКАКОГО способа установить слот напрямую в N или запросить текущий номер слота, поэтому отслеживайте его на стороне клиента или идите от известной позиции. Для загрузки конкретного слота БЕЗ изменения указателя используйте retroarch_load_state_slot. ПОВЕДЕНИЕ: Изменяет внутренний указатель текущего слота RetroArch (-1). Зацикливается или ограничивается согласно конфигурации циклического переключения слотов RetroArch (обычно зацикливается на 0 → 9). ОТПРАВИЛ-И-ЗАБЫЛ: NCI НЕ подтверждает эту команду. Вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения того, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно вызовите наблюдаемый инструмент (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). Если RetroArch не слушает порт, UDP-пакеты молча отбрасываются. Новый номер слота НЕ сообщается. Отслеживайте его на стороне клиента или следите за индикатором слота на экране. На память эмулятора и состояние запуска не влияет: меняется только указатель слота, который используют будущие вызовы save_state_current / load_state_current. ТРАНСПОРТ: Network Control Interface (NCI) RetroArch поверх UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Одну строку 'Decremented current slot' (только подтверждение отправки UDP, новый номер слота НЕ сообщается).

Параметры

Без параметров.

retroarch_state_slot_plus

НАЗНАЧЕНИЕ: Увеличивает указатель текущего выбранного слота сохранения RetroArch на 1 (например, слот 3 → слот 4). ИСПОЛЬЗОВАНИЕ: Комбинируйте с retroarch_save_state_current или retroarch_load_state_current, чтобы нацелиться на конкретный слот: эти инструменты всегда работают с текущим слотом, поэтому, чтобы сохранить В слот 5, сначала нужно довести до него указатель. Сочетайте с retroarch_state_slot_minus, чтобы идти назад. NCI в RetroArch НЕ предоставляет НИКАКОГО способа установить слот напрямую в N или узнать текущий номер слота, поэтому, если вы не отслеживаете его сами, нужно идти от известной позиции (например, слот 0) или следить за индикатором на экране. Для загрузки конкретного слота БЕЗ изменения указателя используйте вместо этого retroarch_load_state_slot. ПОВЕДЕНИЕ: Изменяет внутренний указатель текущего слота RetroArch (+1). Заворачивается или ограничивается в соответствии с конфигурацией циклического переключения слотов RetroArch (обычно заворачивается на 9 → 0). ОТПРАВИЛ И ЗАБЫЛ: NCI НЕ подтверждает эту команду: вызов возвращается, как только UDP-датаграмма отправлена, без подтверждения того, что RetroArch получил или применил её. Чтобы проверить результат, дополнительно используйте наблюдаемый инструмент (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). UDP-пакеты, отправленные в RetroArch, который не слушает порт, молча отбрасываются. Новый номер слота НЕ сообщается обратно: отслеживайте его на стороне клиента или следите за индикатором слота на экране. На память эмулятора / состояние запуска не влияет: меняется только указатель слота, используемый будущими вызовами save_state_current / load_state_current. Транспорт: сетевой интерфейс управления RetroArch (NCI) по UDP (по умолчанию 127.0.0.1:55355, требует network_cmd_enable = true в retroarch.cfg). ВОЗВРАЩАЕТ: Одну строку 'Incremented current slot' (только подтверждение отправки UDP: новый номер слота НЕ сообщается).

Параметры

Без параметров.

retroarch_write_memory

НАЗНАЧЕНИЕ: Записывает последовательность байтов в эмулируемую память через карту системной памяти ядра libretro (WRITE_CORE_MEMORY). ИСПОЛЬЗОВАНИЕ: Предпочтительный инструмент для записи в память, когда загруженное ядро предоставляет карту памяти. Применяется для читов, отладочных модификаций и изменения состояния игры (дать игроку N жизней, установить флаг, установить чит-таблицу). Если он возвращает 'no memory map defined', переключитесь на retroarch_write_ram. Максимум 4096 байт за вызов (ограничение длины строки NCI); для больших записей разбивайте на блоки по 4 КиБ. Чтобы сначала установить точку отката, используйте retroarch_save_state_current. ПОВЕДЕНИЕ: ОПАСНО: перезаписывает N байт, начиная с address, без возможности отмены (сделайте снимок через retroarch_save_state_current заранее, если нужен откат). Отключает режим hardcore в RetroArch на всю оставшуюся сессию (RetroArch молча переключает этот флаг при использовании любой NCI-команды записи в память). В ОТЛИЧИЕ от большинства NCI-команд, эта команда ВОЗВРАЩАЕТ количество: RetroArch отвечает числом фактически записанных байт, которое может быть меньше запрошенного, если во время записи встретился дескриптор только для чтения (запись всё равно применяется вплоть до этой границы). Прямая запись в память - обходит семантику MBC/маппера/DMA. Транспорт: Network Control Interface (NCI) RetroArch по UDP (по умолчанию 127.0.0.1:55355, требуется network_cmd_enable = true в retroarch.cfg). Возвращает ошибку, если загруженное ядро не предоставляет карту памяти, адрес недействителен, массив байтов пуст или больше 4096, или истёк таймаут UDP-запроса. 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). Работают даже без карты памяти ядра, но адреса…

Параметры
  • addressintegerобязательный

    Начальный адрес в карте системной памяти ядра libretro (НЕ в пространстве CHEEVOS). Байты записываются последовательно: address, address+1, ..., address+N-1.

  • bytesinteger[]обязательный

    Значения байтов для записи, по одному на элемент (каждое 0-255). Длина 1-4096 (жёсткое ограничение из-за размера одного датаграмма NCI в RetroArch). Запись идёт последовательно начиная с address. Если в середине массива встретится дескриптор, доступный только для чтения, запись остановится на этой границе, а ответ сообщит, сколько байтов реально записалось.

retroarch_write_ram

НАЗНАЧЕНИЕ: Записывает последовательность байт в эмулируемую память через адресное пространство достижений (CHEEVOS) (WRITE_CORE_RAM). ИСПОЛЬЗОВАНИЕ: Запасной инструмент записи в память: используйте, когда retroarch_write_memory возвращает 'карта памяти не определена' или ядро поддерживает только старый API записи CHEEVOS. Максимум 4096 байт за вызов (ограничение длины строки NCI). Чтобы убедиться, что запись прошла (эта команда НЕ подтверждает; см. ПОВЕДЕНИЕ), выполните следом retroarch_read_ram по тому же адресу. Чтобы сначала создать точку отката, используйте retroarch_save_state_current. ПОВЕДЕНИЕ: РАЗРУШАЮЩЕЕ: перезаписывает байты, начиная с address, без отмены (сначала сделайте снимок через retroarch_save_state_current, если нужен откат). Отключает hardcore-режим RetroArch до конца сессии. ОТПРАВИЛ И ЗАБЫЛ: NCI НЕ подтверждает эту команду. Вызов возвращается сразу после отправки UDP-датаграммы, без подтверждения, что RetroArch её получил или применил. Чтобы проверить результат, выполните следом инструмент с наблюдаемым результатом (retroarch_get_status для состояния запуска, retroarch_read_memory / retroarch_read_ram для изменений памяти, retroarch_screenshot для визуального состояния). Если RetroArch не слушает порт, UDP-пакеты молча отбрасываются. Это ключевое поведенческое отличие от retroarch_write_memory, который ВОЗВРАЩАЕТ счётчик: write_ram не может сообщить о частичной записи или отклонённом адресе. Единственный способ проверить — это последующий retroarch_read_ram. Прямая запись в память: обходит семантику MBC/маппера/DMA. Транспорт: сетевой интерфейс управления RetroArch (NCI) по UDP (по умолчанию 127.0.0.1:55355, требуется network_cmd_enable = true в retroarch.cfg). Локальная проверка входных данных отклоняет пустые массивы, более 4096 байт или значения вне 0-255 перед отправкой UDP. RetroArch предоставляет ДВА различных API памяти с разными адресными пространствами: • READ_CORE_MEMORY / WRITE_CORE_MEMORY (используется retroarch_read_memory / retroarch_write_memory): проходит через карту системной памяти ядра libretro. Предпочтителен, когда загруженное ядро объявляет карту памяти (большинство современных ядер…

Параметры
  • addressintegerобязательный

    Начальный адрес в адресном пространстве CHEEVOS (achievements), которое отличается от карты системной памяти libretro, используемой retroarch_write_memory. О нюансах адресного пространства читайте в retroarch_read_ram. Байты записываются последовательно: address, address+1, ...

  • bytesinteger[]обязательный

    Значения байтов для записи, по одному на элемент (каждое 0-255). Длина 1-4096 (жёсткое ограничение из-за размера одного датаграмма NCI в RetroArch). Записываются последовательно начиная с address. Так как RetroArch не подтверждает эту команду, частичные или отклонённые записи невозможно отличить от успешных на уровне протокола.

0.1.3основная
0.1.2
0.1.1
0.1.0

Выберите клиент, чтобы установить dmang-dev/mcp-retroarch:

Любой клиент

Конфиг добавления MCP сервера стандартный, обычно он не меняется вообще, поэтому подходит практически к любому ИИ клиенту, поддерживающему MCP.

{
  "mcpServers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}
CursorCursor

Перейдите по ссылке и сервер автоматически будет добавлен в Cursor. Либо откройте/создайте файл ~/.cursor/mcp.json(%USERPROFILE%\.cursor\mcp.json на Windows) и добавьте конфиг сервера:

{
  "mcpServers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}
VS Code

Создайте .vscode/mcp.json в проекте (ключ верхнего уровня — servers):

{
  "servers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}

Либо добавьте сервер через терминал:

code --add-mcp "{\"name\":\"dmang-dev-mcp-retroarch-uoyfx1wgqw\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"mcp-retroarch\"]}"
ClaudeClaude Desktop

Откройте Settings → Developer → Edit Config — это откроет файл claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Впишите сервер и полностью перезапустите Claude Desktop:

{
  "mcpServers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}
Claude CodeClaude Code

Добавьте сервер одной командой в терминале:

claude mcp add dmang-dev-mcp-retroarch-uoyfx1wgqw -- npx -y mcp-retroarch

Либо через JSON-конфиг:

claude mcp add-json dmang-dev-mcp-retroarch-uoyfx1wgqw "{\"command\":\"npx\",\"args\":[\"-y\",\"mcp-retroarch\"]}"
CodexCodex

Добавьте сервер командой в терминале:

codex mcp add dmang-dev-mcp-retroarch-uoyfx1wgqw -- npx -y mcp-retroarch

Либо вручную в ~/.codex/config.toml(%USERPROFILE%\.codex\config.toml на Windows):

[mcp_servers.dmang-dev-mcp-retroarch-uoyfx1wgqw]
command = "npx"
args = ["-y", "mcp-retroarch"]
PerplexityPerplexity

MCP доступен подписчикам Perplexity Pro / Max / Enterprise. Локальные серверы — только в приложении для macOS.

  1. Откройте Настройки аккаунта → Connectors.
  2. Установите вспомогательное приложение PerplexityXPC (один раз).
  3. Нажмите Add Connector → вкладка Simple.
  4. В поле Server Name укажите dmang-dev/mcp-retroarch, а в поле команды запуска — строку ниже:
npx -y mcp-retroarch

Нажмите Save и дождитесь статуса Running.

WindsurfWindsurf

Откройте Windsurf Settings → Cascade → MCP Servers или отредактируйте файл ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}
ClineCline

В панели Cline нажмите иконку MCP Servers → Configure → Configure MCP Servers (или отредактируйте ~/.cline/mcp.json) и добавьте сервер:

{
  "mcpServers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ],
      "disabled": false,
      "autoApprove": []
    }
  }
}
Continue

Создайте файл в .continue/mcpServers/ (например dmang-dev-mcp-retroarch-uoyfx1wgqw.yaml) или добавьте блок в config.yaml. MCP работает только в режиме agent:

mcpServers:
  - name: dmang-dev-mcp-retroarch-uoyfx1wgqw
    command: npx
    args:
      - "-y"
      - "mcp-retroarch"
Zed

Выполните agent: add context server или откройте настройки (zed: open settings file) и добавьте сервер в объект context_servers:

{
  "context_servers": {
    "dmang-dev-mcp-retroarch-uoyfx1wgqw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-retroarch"
      ]
    }
  }
}

Похожие MCP-сервера

dmang-dev/mcp-dolphin

dmang-dev/mcp-dolphin

от dmang-dev

MCP-сервер для эмулятора Dolphin (GameCube/Wii). Читает и пишет память PowerPC, управляет контроллерами, сейвами и покадровым продвижением — через MCP-клиенты. Работает с форком Felk. Помогает в TA...

TypeScript⭐ 5
jkiley129/steam-mcp

jkiley129/steam-mcp

от jkiley129

Этот MCP сервер подключает Claude к вашей библиотеке Steam. Ищите игры по названию, времени, статусу, получайте детали: жанры, рейтинг, цену. Задавайте вопросы на естественном языке - сервер сам работает с API Steam.

TypeScript⭐ 6
n24q02m/better-godot-mcp

n24q02m/better-godot-mcp

от n24q02m

Сервер для разработки игр на Godot Engine с AI-агентами: 17 инструментов для управления сценами, скриптами и ресурсами напрямую, без запуска редактора. Ускоряет создание прототипов.

TypeScript⭐ 36
jhomen368/steam-reviews-mcp

jhomen368/steam-reviews-mcp

от jhomen368

MCP-сервер для игр Steam: поиск, обзоры и анализ настроений. Ищите игры, загружайте отзывы с временными срезами и фильтрами, получайте NLP-анализ тональности. Полезен разработчикам AI-ассистентов. ...

TypeScript⭐ 3
jiayao/mcp-chess

jiayao/mcp-chess

от jiayao

MCP-сервер для игры в шахматы с любой языковой моделью. Включает визуализацию доски, ходы в SAN, список допустимых ходов и поиск позиции в PGN по условию. Полезен для обучения и анализа партий.

Python⭐ 24
antics-gg/antics-mcp

antics-gg/antics-mcp

от antics-gg

MCP сервер, который позволяет AI-агенту написать веб-игру и мгновенно развернуть её как мультиплеер по ссылке. Идеально для быстрого прототипирования: одной командой вы даете друзьям доступ к игре с живой синхронизацией и лидербордом.

TypeScript⭐ 5
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин