Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - pav13

Страницы: [1] 2 Далее
1
Можно добавить поддержку CDL и игнорировать незалогированные команды, если стоит цель найти что-то конкретное, а не рандомные сюрпризы.
будет ли такой поиск более эффективным - однозначно да, но будет ли практичным - тут уже вопрос.
когда переглючиваются случайные инструкции в rom, то пользователю "достаётся" лишь часть из них на каждом шаге и это не так сильно ломает игру.
если обрабатывать только задействованные инструкции, то придётся буквально по несколько штук менять, чтобы игра хоть как-то "ворочалась".
опять же как ведут себя данные CDL и являются ли они частью savestate? потому как весь процесс завязан на loadstate.

Сэкономит кучу времени при поиске.
после добавления Глитчера в эмуляторы с этим проблем нет, каждый шаг это одно нажатие и доли секунды занимает.

2
обновил Lua скрипт для FCEUX

0.2.0
* совместимость с FCEUX 2.2.3+ (работает менее стабильно чем с 2.6.6)
* один русскоязычный файл скрипта для Qt и не-Qt версии
* улучшение консольного интерфейса
+ добавлена возможность сохранения модифицированного ROM
+ добавлены инструкции ветвлений: BCC, BCS, BMI, BPL, BVC, BVS
+ добавлена возможность выбора групп инструкций для поиска
+ сохранение настроек в cfg-файл (можно редактировать управление и другое)
+ добавлен режим отладки с выводом в файл
- убрано определение размера ROM по заголовку NES 2.0 (временно)


немного погрузился в изучение lua и документации fceux. конечно, это скриптовый/встраиваемый язык, но блин, какая же лафа по сравнению с си в плане синтаксиса и типов переменных.

3
Lua скрипт для эмулятора  FCEUX
ROM Glitcher: Instruction Inverter
Инструмент для казуального поиска глитчей

303238-0


Идея Глитчера: perfect_Беларус. Реализация скрипта: pav13



Доступно на двух языках - русском и английском.
Поддержка FCEUX 2.2.3+.

Все изменения в памяти эмулятора, на диск ничего не пишется и ROM файл не изменяется.
Все загрузки/перезагрузки происходят автоматически, переключаться между окнами не надо. Есть возможность сохранить модифицированный ROM.

Как пользоваться:
  • Запустить эмулятор
  • Загрузить ROM игры
  • File -> Load Lua Script
  • Выбрать файл скрипта
  • Нажать Start
  • Следовать подсказкам в консоли

Управление и другие параметры можно изменить в файле rom-glitcher-FCEUX-config.cfg.







Цитата: ... всё тот же великий человек
«Я не учитель. Я просто помогаю тебе изучать глитчи.»

4
добавь возможность указать не только f-клавиши, но и комбинацию, чтобы не переназначать в эмуляторе. пытался забиндить f12 и f11, после f11 окно консоли стало на весь экран и заблокировался ввод, кроме 1/2/3. мне стало больно и дальше не осилил.

и насчёт обновления не понял, оно заменит исполняемый файл даже если он переименован? то есть назад на предыдущую версию будет не откатиться. да и запрос бы не помешал типа "есть новая версия. обновить?"

upd:
как основной вариант развития - сделать gui. и там клавиши указывать, выводить информацию вместо консоли, путь к ром или то же перетаскивание, указать путь к эмуляторам nes и sega, "альтабится" на окно процесса по имени exe-файла, сохранение настроек в config.ini

5
При открытии другого рома search_pause.dat сейчас удаляется.
вот только я не могу открыть другой ром пока файл search_pause.dat есть в папке программы. двойной клик по программе = продолжение поиска. разве что перетаскивание сработало, но от чего уходили к тому и вернулись.  :neznayu:

При открытии другого рома search_pause.dat сейчас удаляется, возможно сделаю чтоб у каждого рома свой создавался с его именем, тут тоже надо будет подумать что и как будет работать и загружаться, если их будет 3-10-1000.
для каждой игры свой файл это лишнее, кмк. просто сделай возможность нового поиска с принудительным прерыванием текущего.

Не могу подтвердить, допустим программа у меня хоть где находится, в созданной специально папке или на рабочем столе по-умолчанию, если ром находится там же, то я его вижу и могу выбрать .nes файлы или можно выбрать all для всего остального.
так и я ром вижу и могу выбрать, только после выбора получаю вот это
300257-0
upd: всё, понял, если есть кириллица в пути к ром-файлу, то программа уже не работает.

Если следовать инструкции, то ничего лишнего вообще не запускается.
Как было задумано, запускаем эмулятор вручную, бежим куда надо, делаем сейв. Вырубаем эмулятор вручную. Включаем автоматизацию, выбираем инструкцию, дальше эмулятор сам будет запускаться и отключаться, надо будет только пункты выбирать до получения результата. Реализовано через вирт нажатия.
делаю по инструкции. эмулятор запускается, но не закрывается после нажатия 1/2/3 в окне консоли. через 10 шагов 10 запущенных копий эмулятора. только вручную надо закрывать. сделай через убийство процесса по имени exe-файла эмулятора, а не через виртуальные alt+f4.

К эмулятору смысл сохранения пути есть, к рому нет, потому что если мы продолжаем с ним работу потом
в принципе да, хотя бы путь к эмулятору постоянно не искать.

6
Допилил до версии 2.2.0

- каждый раз приходится по новой указывать путь к эмулятору. сделай создание ini файла с параметрами типа,
last rom path=путь\к\ром
emulator path=путь\к\эмулятору.exe

- лишнее меню при запуске программы, пускай сразу открывается диалоговое окно выбора файла, а папка по умолчанию берётся из ini: last rom path

- при выборе шага запускается копия эмулятора. добавь убийство процесса перед этим. а вообще зачем ручное закрытие и автоматический новый запуск эмулятора, это затягивание времени. по сути надо делать alt+tab, потом ctrl+f1, потом P.
как у тебя это реализовано? передача виртуальных нажатий или через аргументы командной строки при запуске эмулятора?

- бэкап создаётся, повторно не перезаписывается(что хорошо), но как по мне не хватает действия "восстановить оригинальный файл из бэкапа"(с возможным удалением бэкапа)

- для прерывания текущего поиска и начала нового с другой игрой надо идти в папку с программой у руками удалять search_pause.dat (может стоит сделать действие "начать новый поиск")

- через диалоговое окно выбора файла невозможно выбрать файл из папки с программой, только из другой (мне не критично и я рад что наконец-то файлы не надо копировать в папку с программой, но такой баг имеет место быть)

- сделай дописывание результата в файл ..._results.txt, а не полную перезапись


upd:
- используется ли отсеивание невалидных опкодов?

- надпись nes glitcher как-то мелко и бедно смотрится в углу может что-то из этого выберешь
* figlet NES Glitcher.txt (2142.34 КБ - загружено 65 раз.)

7
Русской локализации в Angry Video Game Nerd 8-bit не будет
с чего вдруг? в steam демо есть текстовая, да и на странице игры указан русский текст

8
Томахомэ, я не знаю как конкретно работает определение int16 в твоём компиляторе, попробуй изменить на конкретное указание int16_t. Но у тебя ещё есть вычисление этого значения и возможно другие переменные int и компилятор заменяет int16 на int.

Но это разовое решение. Если надо везде и сразу, то надо указать компилятору что int это 16 битное число. Как это конкретно сделать не знаю (не пробовал).

9
Должно ли после этого выводимое в сообщении отрицательное число всё так же состоять из 8 16-ричных цифр?

printf("Destination is %x\n",val); вывод в hex.

printf("Destination is %02X\n",val); вывод в hex с ограничением длины.

printf("Destination is %d\n",val); вывод в знаковое десятичное. (%i)

printf("Destination is %u\n",val); вывод в беззнаковое десятичное.

если сейчас у тебя выводится как 32 битная переменная, то попробуй конкретно указать тип для компилятора
printf("Destination is %04x\n", (uint16_t)val); должно выводить два младших байта в hex.

10
Ромхакинг / Качественные РОМ-хаки игр
« : 11 Октябрь 2025, 21:55:26 »
Три хака, где из игр Марио сделали игры с механиками всем известной инди-игры Celeste
Celeste Mario’s Zap & Dash! (2023) и Celeste Mario's Zap & Dash DELUXE! (2025) по сути один хак, только deluxe более новая версия. действительно качественный хак.
 дэш в пол заставляет попотеть, а это только первые условные 15 экранов прошел.
чувствуется как будто celeste со скинами марио, а не наоборот.

а вот Celeste.SMC (2022) мне не понравился, хотя визуально больше похож на celeste.

11
Ромхакинг / Качественные РОМ-хаки игр
« : 11 Октябрь 2025, 18:53:53 »
мне как неискушенному игроку всё нравится. да, название темы "громкое". да, попадаются не очень рабочие ромы (например sor2 шаман кинг - графические артефакты). да, обилие соников/mega man/adventure island лично у меня вызывает негодование.

но зато остальная часть годная, тот же sor2 tmnt re-revenge топ.

обидчивость ТС вызывает непонимание. пили исчо.

12
Программирование / Ребенок изучает asm [SMD]
« : 11 Октябрь 2025, 18:15:40 »
Томахомэ, используй вместо int конкретные указания размерности
int8_t
int16_t
int32_t
int64_t

то же самое и для uint если надо.

или переопредели int на int16 (int16_t)

13
раз пошли примеры
вот http://www.zincland.com/7drl/savescummer/ инди рогалик
вся игра через сэйвскам

например её порт
https://www.gamebrew.org/wiki/Save_Scummer_PSP

14
Попутно воссоздал сам спрайт на основе скриншотов из сериала.

https://stock.adobe.com/kz/images/vector-pixel-art-basketball-player/297261711

и нет, искал не по готовому арту, а по кадру сериала.

15
NesGlitcher v2.1.1
Фикс счётчиков.

как по мне nes глитчеру, да впрочем как и оригинальному, не хватает функционала "Лаунчера". а то от перетаскивания файла на файл вымораживает, особенно в total cmd.

вот хотя бы батник положить в папку
@echo off

:menu
cls
echo ==========================
echo    NesGlitcher Launcher
echo ==========================
echo.

set count=0
echo Found ROM files:
echo ----------------
echo 0. CONTINUE SEARCHING
echo.

dir /b *.nes *.fds *.bin *.rom 2>nul > temp_list.txt

for /f "tokens=*" %%f in (temp_list.txt) do (
    set /a count+=1
    call echo %%count%%. %%f
    call set "file_%%count%%=%%f"
)

del temp_list.txt 2>nul

echo.

if %count%==0 (
    echo No NES ROM files found.
    echo Supported: .nes .fds .bin .rom
    echo.
    pause
    exit /b
)

:input
set choice=
set /p "choice=Enter file number (0~%count%) or 'q' to quit: "

if "%choice%"=="q" exit /b
if "%choice%"=="0" goto launch
if "%choice%"=="" goto input

set valid=0
for /l %%i in (1,1,%count%) do (
    if "%choice%"=="%%i" set valid=1
)

if "%valid%"=="0" goto invalid

call set selectedFile=%%file_%choice%%%

echo.
echo Launching: %selectedFile%
echo.

:launch
set glitcherExe=
for %%e in (nesglitcher*.exe) do set glitcherExe=%%e

if "%glitcherExe%"=="" (
    echo Error: nesglitcher*.exe not found!
    echo.
    pause
    exit /b
)

if "%choice%"=="0" "%glitcherExe%"&goto menu

echo Running: %glitcherExe% "%selectedFile%"
echo.
"%glitcherExe%" "%selectedFile%"

goto menu

:invalid
echo Invalid input. Please enter a number between 0 and %count%.
goto input

* !RUN NesGlitcher.bat.txt (1.38 КБ - загружено 65 раз.)

upd:
NesGlitcher v2.1.1 сломан, нажимаю Найден и сразу получаю 1 инструкцию. А куда делась "Локализация"?

16
Sharpnull сжал сильнее, но код довольно сложный для глаз.
У него сжато только изначальное хранение. При проверке опкода на валидность используется массив на 8192 байта. Разница в том, что у тебя этот массив объявлен и инициализирован, а у Sharpnull он лишь объявлен и инициализируется отдельной функцией. Но массивы в кеше одного размера.

17
толсто, пробуй тоньше.

Угараю над нейронками
или нейронки над тобой
Цитата
⚖️ Вердикт

Скорее всего, да, он тролль.

Но не примитивный хам, а более сложный тип — тролль-провокатор, который:

    Обладает достаточными знаниями в обсуждаемых темах (игры, ИИ, эмуляция).

    Использует эти знания для создания видимости компетентности и усиления своих провокаций.

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

Его можно назвать «качественным троллем», так как его сообщения содержат полезный контент (обзоры игр, опыт использования ИИ), который служит приманкой и прикрытием для последующих провокаций. Это делает его более эффективным и опасным для сообщества, чем простой оскорбитель.

18
Разное / Юмор
« : 04 Октябрь 2025, 00:47:34 »
Softer, silksong, кмк

19
как бы не готов изучать инструкцию notepad++
Так это и не "изучение чего-то нового". Это конкретный ответ и последующая его проверка на практике. А вот если бы ты всё время спрашивал-запоминал, спрашивал-запоминал, то было бы обучение. Или допустим не проверил, а побежал бы другим рассказывать. От тветственность при этом вся на тебе. И ладно это ерунда, а если более серьезные вещи спрашивать.

Vlad тактично умолчал про расчет удобрений на куб воды и дал ответ о "навозе".

20
Этот ответ я привел на твой наезд на нейронки
это ты сейчас их защищаешь. а спроси сколько надо конкретных удобрений на тонну воды? а как проверять ответ будешь? спросишь у другой нейронки? а к этому моменту уже все посевы загнулись от переизбытка азота.

21
ИИ полезен. Очень помогает с рутинными действиями.

Но только если им пользуется умный человек, а если его начнут применять глупые/ленивые/ люди (коих большинство), то тут полезут проблемы.

А вот заниматься изучением нового с помощью ИИ я бы не стал. Чат пурги столько прогонит, а ты даже не поймёшь этого. Особенно доставляет убеждённость в заведомо неправильных ответах. Только после нескольких указаний на непринятие результата - "Ой, дико извиняюсь, ты молодец."

22
выяснилось, что таблица валидности из musashi (ранее тут выложенная) для процессора именно m68000, а не для m680x0.

https://www.emu-land.net/forum/index.php/topic,91585.msg1655231.html#msg1655231
https://www.emu-land.net/forum/index.php/topic,91585.msg1655372.html#msg1655372

чтобы сделать из неё таблицу для процессора m68000 именно SEGA MD надо дополнительно убрать нечётные опкоды ветвлений.


для m680x0 есть такая таблица
https://github.com/capstone-engine/capstone/blob/next/arch/M68K/M68KInstructionTable.inc

23
Anakinevgen, если дашь список адресов и необходимых значений, то добавлю.
https://www.emu-land.net/forum/index.php/topic,77919.msg1647731.html#msg1647731

может тут найдёшь нужное
https://www.emu-land.net/forum/index.php/topic,88982.msg1649494.html#msg1649494


RandomDude64xx, переименуй папку с музыкой, и попробуй поиграть без неё. если тормоза остались, то увы, лучше на 3DS не будет.


upd:
уже не помню было в теме или нет.
Android ARM v8 ядро от chunkyjackson
Цитата
Tested on a OnePlus 7T, Tablet, and a Retroid Pocket 5.

24
закинул musashi m68000 opcode table в excel.
уточню, что эта таблица именно для m68000

можно ввести опкод в ячейке С1, а в E1 будет результат.

онлайн
https://docs.google.com/spreadsheets/d/15_shH2m7CCpVwqm5QfqcWF_k1o0iEjfTGDsFVrJkLrQ/edit?usp=drive_link

оффлайн
* musashi m68000 opcode table.zip (97.79 КБ - загружено 79 раз.)


upd:

просто оставлю это здесь

298568-1

25
Таблицу можно сжать
:thumbup: 8 Кб это не 65 Кб

UPD: переписал на си.


всё работает. спс

26
Нужно использовать дизассемблер и не страдать фигнёй. Всё равно придётся проверять допустимость, что у branch инструкции размера byte не смещение 00 и что переходы в пределах рома (UPD: ещё код в RAM учитывать).
для простых задач простые решения.

прикрутил таблицу валидности опкодов, дало неплохое отсеивание.
// Читаем нормализованный ROM
uint8_t high_byte = 0;
uint8_t low_byte = 0;
int32_t target_addr = 0;
uint32_t trim = rom_has_header ? 0 : 0x200;

for (uint32_t byte_addr = trim; byte_addr + 1 < rom_size; byte_addr += 2) {
    high_byte = rom_data[byte_addr];

    // Ищем только BEQ(0x67) и BNE(0x66)
    if (high_byte != 0x66 && high_byte != 0x67)
        continue;

    low_byte = rom_data[byte_addr + 1];

    // Проверка целевого адреса на чётность и попадание в ROM
    if (low_byte != 0 && (low_byte & 1) == 0) {
        // Короткое смещение
        target_addr = byte_addr + 2 + (int8_t)low_byte;
    }
    else {
        // Длинное смещение
        if (low_byte != 0)
            continue;

        if (byte_addr + 3 >= rom_size)
            continue;

        uint16_t disp16 = (rom_data[byte_addr + 2] << 8) | rom_data[byte_addr + 3];

        if ((disp16 & 1) != 0)
            continue;

        target_addr = byte_addr + 2 + (int16_t)disp16;
    }

    if (target_addr < (int32_t)trim || (target_addr + 1) >= (int32_t)rom_size)
        continue;

    // Проверка данных по целевому адресу на легальность для M68K
    if (!m68k_opcode_valid[(rom_data[target_addr] << 8) | rom_data[target_addr + 1]])
        continue;
   
    // Правдоподобная BEQ/BNE инструкция
/* последующая обработка ......*/

}

27
в эмуляторе genesis plus gx есть
https://github.com/ekeeke/Genesis-Plus-GX/blob/master/core/m68k/m68ki_instruction_jump_table.h

скорее всего это сохранённый результат работы "build opcode table" из musashi, чтобы не создавать эту таблицу каждый новый запуск.

это массив размером 65536 элементов из обработчиков всех опкодов. если на месте опкода обработчик m68k_op_illegal,  m68k_op_1111 или m68k_op_1010 - то это не инструкция.

Добавлено позже:
m68k_op_illegal - 11529 опкодов
m68k_op_1010 - 4096 опкодов
m68k_op_1111 - 4096 опкодов

итого ~30.1 % всех возможных опкодов изначально нелегальные

https://pastebin.com/cnzH46gt
в виде bool массива для удобства использования. если обработчик был m68k_op_illegal,  m68k_op_1111 или m68k_op_1010, то false, а для всех остальных true.



28
сам ром переглючивает в памяти и запускает каждый шаг в этом эмуляторе из памяти?
да

Цитата
то есть без создания рома как файла на жестком диске?
да

29
всё делается в памяти, как ты и хотел.

то что всё делается в памяти - это конечно хорошо. но я думаю, что SeregaZ имел ввиду немного другое под

... в виде дллки, чтобы подключать его к своим проектам ...


то что сейчас сделано это не динамическая библиотека именно Глитчера, это один конкретный эмулятор с Глитчером внутри.


30
Ромхакинг / [ALL] Вопросы новичков
« : 01 Сентябрь 2025, 19:35:35 »
Sharpnull, спасибо. Это видимо знать надо, логикой и не пахнет. Думал что раз длинное смещение, значит вся команда 4 байта и соответственно PC будет на позиции 0x0404.

upd: N дней спустя...
надо было просто глянуть исходный код musashi, обработку опкода длинного смещения.
static void m68k_op_bne_16(void)
{
  if(COND_NE())
  {
    uint offset = OPER_I_16();
    REG_PC -= 2;
    m68ki_branch_16(offset);
    return;
  }
  REG_PC += 2;
  USE_CYCLES(CYC_BCC_NOTAKE_W);
}

Страницы: [1] 2 Далее