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

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


Сообщения - pav13

Страницы: [1] 2 Далее
1
Напишу сюда. Нашел в закромах Rebelstar - Tactical Command (U) [T+Rus] (v2) GBA, на сайте только v1.
https://www.emu-land.net/portable/gba/roms/rebelstar-tactical-command

2
Интерактивный визуализатор бинарных файлов
Байт-о-скоп (Byte-o-scope)

306898-0


Автор: pav13 (pav13@mail.ru)
Примечание: Часть кода была сгенерирована или доработана с использованием ИИ.











Добавлено позже:
Скрипт изначально создавался как "игрушка" на один раз, но позже оброс дополнительным функционалом и оптимизацией. Решил поделиться, чтобы он у меня на харде не пылился.

Из наиболее близких аналогов:
- binocle (https://github.com/sharkdp/binocle)
- ImageHeat (https://github.com/bartlomiejduda/ImageHeat)
С тематическим списком софта можно ознакомиться тут https://suszter.com/hexlasso/a-collection-of-utilities

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

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

4
обновил 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. конечно, это скриптовый/встраиваемый язык, но блин, какая же лафа по сравнению с си в плане синтаксиса и типов переменных.

5
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.







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

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

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

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

7
При открытии другого рома 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.

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

8
Допилил до версии 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 КБ - загружено 148 раз.)

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

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

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

11
Должно ли после этого выводимое в сообщении отрицательное число всё так же состоять из 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.

12
Ромхакинг / Качественные РОМ-хаки игр
« : 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.

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

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

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

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

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

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

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

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

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

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

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

17
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 КБ - загружено 143 раз.)

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

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

19
выяснилось, что таблица валидности из 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

20
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.

21
закинул 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 КБ - загружено 108 раз.)


upd:

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

298568-1

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

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


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

23
Нужно использовать дизассемблер и не страдать фигнёй. Всё равно придётся проверять допустимость, что у 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 инструкция
/* последующая обработка ......*/

}

24
в эмуляторе 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.



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

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

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

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

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


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


27
Ромхакинг / [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);
}

28
Ромхакинг / [ALL] Вопросы новичков
« : 01 Сентябрь 2025, 15:43:44 »
добрый день. у меня вопрос по командам для процессора m68k sega md.

в частности как рассчитывается адрес после команды смещения короткого и длинного?
BNE короткое
адрес   данные
0х0400 0х66
0х0401 0х38

т.е. мне надо к 0х0402 прибавить 0х38.

BNE длинное
адрес   данные
0х0400 0х66
0х0401 0х00
0х0402 0х50
0х0403 0х22

а в этом случае как правильно?

0х0402 + 0х5022  или  0х0404 + 0х5022

29
кто-нибудь в курсе происходит ли вообще дальнейшая разработка маппера (хоть и в лице одного эмулятора) для paprium?

потому как нехитрый вывод логов выявил что из 28 команд не имеют своих обработчиков аж 11.
https://github.com/pav1388/Genesis-Plus-GX-PUNCHiUM/issues/1#issue-3284130573

имя команды | общее количество вызовов | общее время выполнения в микросекундах | минимальное | максимальное | среднее

30
Да, было бы не плохо  :)
проблема с кириллицей в пути наблюдается только с определённым форматом аудио или со всеми?
если только с wav, то я знаю в чём проблема, а если со всеми, то надо думать.
Chaotix, получается, если дело только в звуке, то теоретически игру можно переделать под Сега Сиди, чтобы не требовался особый эмулятор, так?
дело не только в sega сd. изначально хотел делать воспроизведение wav через sega сd, но потом решил не мучаться и свернул в сторону библиотеки dr_wav.  потому как это не решило бы основной проблемы с запуском.

в fbneo сделано воспроизведение то ли через cd, то ли через общий для этой экосистемы sampler. и размер аудио при этом 2,5 Гб с максимальным качеством и без вариантов. нет уж спасибо. весь смысл применения внешней библиотеки - это возможность использовать аудио любого качества (частота дискретизации, mono/stereo), что является необходимым для относительно слабых устройств.

посмотри сравнение первого коммита в форке с оригиналом, там и без воспроизведения музыки много изменений. не факт, что они вообще доберутся до основного репозитория.
https://github.com/pav1388/Genesis-Plus-GX-PUNCHiUM/commit/df148e5d13822b369470d9003b5479095d2d7a97


по-моему есть форк Genesis-Plus-GX-Extended-rom-size или что-то похожее. вроде как версия для запуска paprium сделана на его основе.

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