Автор Тема: [ALL] Вопросы новичков  (Прочитано 20832 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nik Pi

  • Пользователь
  • Сообщений: 148
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #180 : 12 Январь 2024, 19:47:32 »
Доброго времени суток!
Вопрос по SMD. Конвертация музыки для ром-хака;
У меня при конвертации файлов VGM в формат SMPS- файлы весят больше, чем сама игра  0_0
Хотел узнать, есть ли способ оптимизации smps файлов помимо smps optimizer?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #181 : 12 Январь 2024, 20:12:43 »
потому что вгм - это дамп регистров во времени. а smps, как и gems - это по сути ноты, что играть, с какими задержками. то есть там не нужно содержать прям ваще всеееее как это вгмка делает. в вгм нет понятия инструмент. каждый раз получается там выставляется не инструмент номер 8 к примеру, а все 39 или сколько то там параметров в регистры инструмента нужного канала. в драйверах же есть что-то типа "выставить инструмент номер 8" и драйвер уже сам все чо надо распихивает читая данные инструмента из одного и того-же места. второе - вгм это как бы вся песня целиком. восемь куплетов, три припева... драйверу это нафиг не надо. ему достаточно 1 куплет и 1 припев. а дальше он их просто мешает в нужном порядке типа 1 куплет, 1 припев, 1 куплет, 1 куплет, 1 припев... в результате песни занимают грамульки совсем. так-же имеет значение сэмплы есть ли в песне. если есть, то песня тоже раздувается в вгм. в драйвере же указано просто: играть сэмпл номер 3. он лезет туда где сэмплы лежат, читает оттуда... вгмки оптимизированные тоже такое в принципе умеют - играть сэмплы из банка внутри вгм, а не из регистров 2А чтоль для сэмплов регистр используется... но чаще всего сэмплы именно что просто регистром играются, а не из банка. лень людям вгмки оптимизировать :)

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #182 : 27 Январь 2024, 10:57:57 »
Подскажите, бывают ли эмуляторы Sega Mega Drive, которые бы могли запретить игре использовать SRAM для сохранений в картридже? То есть, сымитировать работу игры на картридже без SRAM.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #183 : 27 Январь 2024, 11:48:44 »
сымитировать работу игры на картридже без SRAM
Укажите неверный промежуток адресов SRAM в заголовке рома - 0x1B4-0x1B7 (начало), 0x1B8-0x1BB (конец). Для простой SRAM в Genesis Plus GX так работает: https://github.com/ekeeke/Genesis-Plus-GX/blob/master/core/cart_hw/sram.c, т. е. нужно, чтобы не было T-26013 в промежутке 0x182-0x18D (rominfo.product), для части ромов есть определение своей SRAM, нужно учесть по этому коду: https://github.com/ekeeke/Genesis-Plus-GX/blob/master/core/cart_hw/md_cart.c, чтобы не было переопределения. UPD: Или просто скомпилируйте эмулятор с отключенной SRAM.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #184 : 27 Январь 2024, 12:51:22 »
Genesis Plus GX
Он есть только в составе Retroarch и Bizhawk. Отдельно его не скачать. Не очень хотелось устанавливать Retroarch или Bizhawk только ради этого.
Укажите неверный промежуток адресов SRAM в заголовке рома - 0x1B4-0x1B7 (начало), 0x1B8-0x1BB (конец).
В Gens этот трюк не помог.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #185 : 27 Январь 2024, 13:22:26 »
Не очень хотелось устанавливать Retroarch или Bizhawk только ради этого
BizHawk нужно просто распаковать, запустить EmuHawk.exe, открыть ром и всё. Не знаю насколько проще может быть.
UPD: Во Fusion есть опция Disable SRAM :) Попробуйте, если он конечно запустит интересующий ром (т. к. древность вместе с Gens).
« Последнее редактирование: 27 Январь 2024, 13:38:09 от Sharpnull »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #186 : 27 Январь 2024, 16:25:55 »
Sharpnull, попробовал Fusion. Опция-то есть, но при ее отключении игра похоже все равно "видит" SRAM. Подозреваю, может она просто отключает запись содержимого SRAM в память.

Ладно. Завтра попробую скачать BizHawk (сегодня уже просто лень с этой игрой ковыряться).

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #187 : 14 Февраль 2024, 09:40:34 »
Кто-нибудь может подсказать, как найти в меню многоигровки значение, отвечающее за количество игр?

Я попробовал так: перевел количество игр в шестнадцетиричное, затем в HEX-редакторе поменял все значения, совпадающие с количеством игр, на новое. Конечно код меню в таком виде не будет работать, так как заменились и те данные, которые не стоило бы менять. Но я загрузил оба файла в программу Visual Sravnilka. Если кто не знает, эта программа может не только сравнивать файлы, но и "подкидывать" измененные участки в оригинальный файл и сразу же запускать ROM на эмуляторе. Подкидывая поочередно измененные участки нашел тот, после которого количество игр изменилось.

Но то, что описал выше, "прокатило" у меня только с одним меню. А то меню, которое нужно отредактировать сейчас, так хакнуть не получилось. Ранее еще исследовал другое меню, там была немного другая система: отдельно задавалось количество "страниц" (то есть, экранов со списком игр) и отдельно задавалось количество игр на каждой "странице". Попробовал на этом меню, попробовал поискать и заменить количество "страниц" - не помогло.

Все. На этом моя фантазия закончилась.

Кто-нибудь знает еще методы, которыми можно вычислить, где расположено это значение?

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 205
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #188 : 14 Февраль 2024, 13:29:35 »
Talking_Sword, если при движении курсора вперед номер игры сначала увеличивается, а только потом сравнивается с лимитом, то значение лимита может быть на 01 больше, чем количество игр.

С дебаггером будет быстрее, чем наугад менять байты и проверять.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #189 : 14 Февраль 2024, 15:49:43 »
Talking_Sword, если при движении курсора вперед номер игры сначала увеличивается, а только потом сравнивается с лимитом, то значение лимита может быть на 01 больше, чем количество игр.
Попробовал, не помогло.
С дебаггером
Увы, это для меня как Китайская грамота. Но я думал, что придется к этому прибегнуть, если ничего другого не сработает.

Можете примерно объяснить, как через отладчик искать значение?

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1159
    • ВКонтакте
    • Steam
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #190 : 14 Февраль 2024, 15:56:38 »
У тебя многоигровка для NES?

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #191 : 14 Февраль 2024, 17:33:17 »
Попробовал, не помогло.
Ищите на 1 меньше кол-ва игр, а не больше: счёт от 0, поэтому либо кол-во игр, либо -1.
Можете примерно объяснить, как через отладчик искать значение?
Для NES в Mesen в Memory найти адрес с индексом выделенной игры, при сдвиге курсора в меню многоигровки это будет видно (либо через поиск читов). Поставить Breakpoint на чтение, при сдвиге курсора случится остановка на коде например LDA $33 | CMP $3C, тогда значение хранится в $3C и было записано ранее, нужно ставить Breakpoint на запись в $3C, но туда тоже могли записать из другого RAM адреса, тогда уже запись туда отслеживать. Если вида LDA $33 | CMP #$07 для 8 игр, тогда это и есть лимит. Также нужно менять переход от 1-го игры к последней похожим образом.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #192 : 14 Февраль 2024, 17:45:35 »
У тебя многоигровка для NES?
Совсем забыл сказать, Sega Mega Drive.
Ищите на 1 меньше кол-ва игр, а не больше: счёт от 0, поэтому либо кол-во игр, либо -1.
Не помогло.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #193 : 14 Февраль 2024, 18:17:30 »
Не помогло.
Там может быть и BCD запись (вряд ли), скиньте ром, уже давно посмотрели бы.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #194 : 14 Февраль 2024, 18:38:32 »
Sharpnull, похоже, там нет BCD. Сначала через RAM Search смог определить адреса, по которым хранится положение курсора - 0xFF0E19 - строка, на которой стоит курсор, 0xFF0E17 - номер "страницы". При помощи отладчика "и какой-то матери" смог определить, где в ROM-е задается количество страниц с играми. И да, там оказалась "система", в которой отдельно задается количество страниц, и скорее всего, где-то должно задаваться количество игр на каждой странице. При чем там какая-то извращенная система - отдельно задается максимальная страница, и отдельно задается страница, которая появится при листании с первой страницы назад. 0x30DF - максимальная страница, 0x2FCD - страница, которая появляется при листании с первой страницы назад.

Добавлено позже:
скиньте ром, уже давно посмотрели бы.
Если я скину ROM, то вы, скорее всего сами разберетесь, фактически сделав мою работу за меня. Мне не хочется вас грузить своей работой.

Добавлено позже:
Я смог разобраться с кодом меню. Спасибо Sharpnull за объяснение, как искать значение через отладчик. Не смотря на то, что там было описано для NES, я смог применить этот совет и для Mega Drive.

Для начала, я изучал вот это меню (прикрепленный файл в конце сообщения). Смог найти там значения, которыми можно изменить размеры списка игр. Там очень извращенческая система.

Адреса в ROM-е:
0x30DF - максимальная страница
0x2FCD - страница, которая появляется при листании с первой страницы назад.
0x2F3B - номер максимальной страницы, чтобы код меню смог отличить ее от "обычной" и ограничить на ней количество строчек (для движения курсора вниз).
0x2EB9 - номер максимальной страницы, чтобы код меню смог отличить ее от "обычной" и ограничить на ней количество строчек (для движения курсора вверх).

0x2F45 - количество строчек на "максимальной" странице.
0x2ECB - на какую строчку переставить курсор, если нажать "вверх" на "максимальной" странице.

0x2F99 - количество строчек на "обычной" странице.
0x2F1D - на какую строчку переставить курсор, если нажать "вверх" на "обычной" странице.
« Последнее редактирование: 14 Февраль 2024, 20:01:57 от Talking_Sword »

Оффлайн Cyneprepou4uk

  • Пользователь
  • Сообщений: 205
  • Пол: Мужской
  • Самый лысый ромхакер
    • ВКонтакте
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #195 : 14 Февраль 2024, 20:43:21 »
Если я скину ROM, то вы, скорее всего сами разберетесь, фактически сделав мою работу за меня. Мне не хочется вас грузить своей работой.

Мое уважение  :hi: взял и сам разобрался на основе подсказок. Еще и инфой поделился. Все бы так делали.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #196 : 16 Февраль 2024, 10:12:21 »
В этой теме уже ранее спрашивал о том, можно ли в эмуляторе выключить SRAM в картридже. К сожалению, ни один способ не помог - ни редактирование заголовка и запуск на Bizhawk, ни Disable SRAM в Fusion.

Дело в том, что есть неофициальный порт-хак игры SegaSonic Bros. с Sega System C2 на Mega Drive. Случайно выяснил, что при запуске "на железе" с картриджа без SRAM она не запускается (черный экран), при этом с SRAM все нормально. Отключение SRAM в эмуляторе нужно было для того, чтобы воссоздать ситуацию, когда она запущена на картридже без SRAM, чтобы потом посмотреть в отладчике, что происходит. Но тем не менее, ни один способ не помог - игра все равно запускалась.

Тем не менее, начал пытаться отлаживать с SRAM. Поставил точку останова на обращения к 0x200000-0x3FFFFF, на сколько я понимаю, в "самом простом" варианте SRAM-память картриджа начинается со второго мегабайта. Отловил пару подпрограмм, из которых идет обращение к SRAM 0x1A200-0x1A24A и 0x1A24C-0x1A296, они вызываются из 0x202 и 0xBF60 соответсвенно. ЗаNOPал эти переходы - обращения к SRAM прекратились. Поиграл немного - обращений к SRAM не было, также игра стала запускаться на приставке даже с картриджа без SRAM. Но все равно есть некоторая параноя, что еще где-то не нашел обращения к SRAM.

Есть ли способ найти обращения к SRAM не гоняя игру в отладчике?

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

У этого хака есть две ревизии:

SegaSonicBrosGenesisTestSRAM.bin
SegaSonicBrosMDRev2.bin

Я хачил вторую. Попробовал первую, там глюка с музыкой нет. Но в первой нет меню. Перенес меню из второй в первую чисто методом тыка - переносил участки, пока в игре не начало появляться меню. За меню похоже отвечают участки с 0x7372 по 0x821F, остальные участки определил уже по признаку близости, так как остальные несовпадающие участки расположены уже относительно далеко. В полной работоспособности меню не уверен, так как там много непонятных опций, но те которые понятные вроде работают.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #197 : 16 Февраль 2024, 16:40:23 »
Отключение SRAM в эмуляторе нужно было для того, чтобы воссоздать ситуацию, когда она запущена на картридже без SRAM, чтобы потом посмотреть в отладчике, что происходит. Но тем не менее, ни один способ не помог - игра все равно запускалась.
Я пробовал вводить случайные байты в область RAM, в которую копируются данные из SRAM, игре всё равно, хотя там есть контрольная сумма, она не проверяется, есть только проверка на буквы SEGA в начале: если их нет, то загрузка рекордов из рома. Подозреваю на вашей железке проблема из-за записи в A130F1 или не нравится чтение и запись в 200001-20FFFF, а эмулятору всё равно и это наверно правильно. Для BizHawk я изменил в роме 1B4: 00 FF 00 00 00 FF 00 00 (взял ром отсюда https://www.retrorgb.com/segasonic-bros-md-released.html), это не дало работать SRAM (не сохранялись рекорды) и ничего не зависало. FF0000 - специальное значение начального адрес SRAM для Genesis Plus GX.
Есть ли способ найти обращения к SRAM не гоняя игру в отладчике?
Поиском в роме нет больше использования 00 A1 30 F1 и 00 20 00 02, скорее всего работа с SRAM только области рома 1A200-1A297. Вызовы этих функций только одному находятся, можно было RTS поставить в начале этих функций, вместо убирания вызовов.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #198 : 16 Февраль 2024, 19:05:01 »
Я совсем забыл написать в своем предыдущем сообщении, что в отладчике заметил обращения к 0xA130F1. Не совсем понятно, зачем это нужно, по идее, через этот регистр может управляться /CE у SRAM, но тут размер ROM-a не более 2 мегабайт, SRAM включается просто по факту доступа свыше 2 мегабайт. А такая система с использованием сигнала /TIME, по идее, нужна только если ROM больше 2 мегабайт.
Подозреваю на вашей железке проблема из-за записи в A130F1
И точно! Я ведь тестировал игру на плате своей первой неудачной многоигровки. Так как попытка была неудачной начал распаивать многоигровку, но не выпаял вторую HC174. На этой плате с установленой HC174 и пытался проверять игру. Теперь пазл складывается - при попытке доступа к SRAM получалось переключение банков, так как у многоигровок 0xA130XX - это переключение банков. Вот игра и не запускалась. Тогда не подумал, что микросхема может помешать, а сейчас уже забыл, что там была эта микросхема.

Сейчас проверил версию, где обращение к SRAM не вырезано, только на этот раз на плате уже не было ничего лишнего - работает. Тем не менее, данная модификация полезна, так как без нее игра не будет работать с многоигровки, а также на Megadrive Portable, так как там схема для переключения игр встроенная.
Подозреваю на вашей железке проблема из-за записи в A130F1
00 A1 30 XX в ROM-е уже искал сам, нашел только в двух местах. А насчет 00 20 00 02 - а там не может быть еще какого-нибудь адреса, то есть не только 02?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #199 : 17 Февраль 2024, 03:57:13 »
Sharpnull, у меня вопрос :) ну такой... на вскидку... насколько реально сделать из Gens эмулятора - библиотеку dll, как с GEMS ты делал? то есть чтоб можно было вшивать в программы и запускать из памяти ромы в ней и все такое прочее...

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #200 : 24 Февраль 2024, 20:49:45 »
Возникли проблемы с запуском игры Tiny Toon 3 (и некоторых хаков Соника) на настоящей приставке. Для выяснения обстоятельств решил скачать эмулятор Exodus, так как, насколько я знаю, он очень точный. На нем игра тоже не запускается. Начал в отладчике выяснять в чем же причина. Оказалось, что игра зависает после инструкции JSR 00006664 по адресу 0x00022A - после нее переходит на адрес 0x006690, хотя по логике вещей должно переходить на 0x006664. В Gens r57shell mod все как надо - после JSR 00006664 переход на 0x006664. Что за фигня?

Сразу говорю, знаю, что в этой игре есть защита, но во первых, есть версия с отломанной защитой, во вторых, методом научного тыка определил, что если заNOPать инструкцию по адресу 0x002C36, то "оригинальная" версия игры начинает запускаться в Gens r57shell mod, но не в Exodus, там просто до туда не доходит.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #201 : 25 Февраль 2024, 09:30:39 »
А насчет 00 20 00 02 - а там не может быть еще какого-нибудь адреса, то есть не только 02?
В данной игре вряд ли, но как обычно нужно либо тестировать, либо разбирать всю игру.
насколько реально сделать из Gens эмулятора - библиотеку dll, как с GEMS ты делал? то есть чтоб можно было вшивать в программы и запускать из памяти ромы в ней и все такое прочее
Вы хотите взаимодействовать между своей программой и эмулятором. Есть разные способы. Написать Lua-скрипт для форка Gens - мало возможностей, дополнить Gens - не вариант для сложных программ, выделить ядро эмуляции в DLL по аналогии с libretro - много работы и в вызывающей программе много кода, но вы имеете в виду весь эмулятор выделить в DLL. Последний вариант наверно не потребует много изменений, но по-моему лучше оставить эмулятор отдельной программой (EXE) и добавить межпроцессное взаимодействие (IPC), для примера можно посмотреть на GDB отладчик, который работает через сокеты. Т. е. будет форк Gens с набором команд, одна из которых для передачи рома, и внешняя программа передающая команды, которая может быть написана на любом языке, нужна только поддержка данного IPC (сокеты есть почти везде).
игра зависает после инструкции JSR 00006664 по адресу 0x00022A - после нее переходит на адрес 0x006690, хотя по логике вещей должно переходить на 0x006664
Адрес 0x006690 - заглушка для таблица векторов (https://tcrf.net/User:Andlabs/68000_ROM_guide#The_68000_Vector_Table), указанная в заголовке рома, поэтому в случае ошибок переход туда. На PC 226 происходит запись в (A1): move.w #$8134,(A1), но регистр A1 не инициализирован, в Exodus он FFFFFFFF на старте, а записывать 2 байта нельзя по нечётным адресам, поэтому срабатывает прерывание Address Error и переход на заглушку. Gens к тому же игнорирует запись по нечётным адресам, но делает кривую запись, из-за чего были хаки/переводы игры, которые работают только в Gens. Другие эмуляторы не игнорируют, но A1 - ноль, поэтому ошибки нет.
Разработчики наверно хотели записать #$8134 в $00C00004. Для исправления поставьте NOP (226: 4E 71 4E 71). Я брал ром отсюда: http://pscd.ru/games/smd/tsmd/1297-tiny-toon-adventures-3.html.
Для Phantasy Star IV (и позже Pirates! Gold) я делал обработчик падений (Crash Handler) на основе кода RoboCop Versus The Terminator. Он универсальный и помогает поймать такие падения (показывает PC и др.), но я не выкладывал код, может позже. Попробовал в Tiny Toon Adventures 3 и он подтвердил причину падения, заодно я нашёл свою недоработку.
UPD: Exodus у меня вечно падал, ещё неудобный, такое себе.
« Последнее редактирование: 25 Февраль 2024, 10:17:40 от Sharpnull »

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #202 : 25 Февраль 2024, 22:53:30 »
Адрес 0x006690 - заглушка для таблица векторов
Спасибо! Я же знал, что в ROM-ах Sega Mega Drive где-то прописаны адреса, по которым совершается переход в случае недопустимых операций, но почему-то совсем забыл об этом.
На PC 226 происходит запись в (A1): move.w #$8134,(A1), но регистр A1 не инициализирован, в Exodus он FFFFFFFF на старте, а записывать 2 байта нельзя по нечётным адресам, поэтому срабатывает прерывание Address Error и переход на заглушку.
Тогда мне не понятно, как это должно работать на железе, ибо в "оригинальной" версии из No-Intro без исправлений тоже так. Защита тут не при чем, так как до нее при выполнении этой инструкции просто не доходит.

Кстати, возможно придумать такой код, который позволял бы выполнять программу дальше, просто игнорируя ошибки? Ну то есть, после перехода на него происходил бы возврат обратно, на следующую инструкцию, после "проблемной"? Ворде можно, в первом Сонике при возникновении ошибок можно прощелкать их кнопкой C, то есть, по идее, можно сделать более простой код, который не требовал бы нажать кнопку.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1159
    • ВКонтакте
    • Steam
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #203 : 26 Февраль 2024, 11:06:28 »
Ещё BlastEm нацелен на точность, лучше и на нём всё проверять. Похоже, он единственный эмулятор, где не заставке Flashback картинка и звук совпадают почти как на реальной приставке.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #204 : 28 Февраль 2024, 13:21:52 »
Подскажите программу типа такой, только для 68000.

И еще, есть ли способ отловить дурацкие ошибки вроде таких:move.w #$0004,($FE11)
Кроме как гонять в отладчике? По идее же можно просто найти все инструкции, которые обращаются к нечетным адресам, при этом имеют размер данных word или long. Есть ли программа, которая могла бы провести такую проверку?

Сразу говорю, понимаю, что адрес можно взять из регистра, поэтому, каким он будет, будет известно только при выполнении. Но если бы можно было проверить хотя бы такие явные ошибки, то это бы было уже хорошо.
Ещё BlastEm нацелен на точность, лучше и на нём всё проверять.
Почему-то думал, что Exodus точнее.
Похоже, он единственный эмулятор, где не заставке Flashback картинка и звук совпадают почти как на реальной приставке.
А в чем там проблема? Я просто не в курсе.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #205 : 28 Февраль 2024, 13:27:33 »
а бесполезно :) я объяснял объяснял человеку... потом плюнул и сделал свое. правда пока ума не хватает сделать с блекджеком и женщинами :)

еще зависит наверное от ассемблера. ASM68K.exe, зараза, иногда подкидывает сурпрызы. поэтому там умеючи надо.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5043
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #206 : 28 Февраль 2024, 18:30:59 »
в первом Сонике при возникновении ошибок можно прощелкать их кнопкой C, то есть, по идее, можно сделать более простой код, который не требовал бы нажать кнопку
Да. Очевидно, что можно убрать требование к нажатию кнопки, но я не буду этим заниматься. Ошибки нужно исправлять, а не играть в говнохаки.
Подскажите программу типа такой, только для 68000
Не разбираюсь, но. Для простых хаков я использовал https://github.com/uxmal/reko - в Tools > Hex disassembler по Hex строке можно увидеть код, там ещё можно открыть ром (путь должен быть без пробелов, иначе нули вместо рома) и щёлкать в Memory View для просмотра инструкций в Disassembly указанного байта. Как простой ассемблер использовал ASM68k_Tool - GUI оболочка для ASM68K, который нужно положить в той же папке.
UPD: Ещё есть Ghidra, там можно и код посмотреть, и инструкции изменить, но на Mega Drive не проверял. Loader: https://www.emu-land.net/forum/index.php?topic=82102.0. UPD2: Я использовал Ghidra как ассемблер для Dreamcast, вводил инструкции, а байты от них вручную вставлял в образ. Можно было бы написать программу для сопоставления адресов с позицией в образе и всё было бы быстрее, но мне нужно было этого для двух игр.
По идее же можно просто найти все инструкции, которые обращаются к нечетным адресам, при этом имеют размер данных word или long
Можно. Составляете список нужных инструкций, в программу записываете их байты и смещение для проверочного байта, ищите каждые 2 байта по кратным 2 позициям в файле (хотя код может быть записан в RAM с нечётной позиции в роме, тогда каждый байт проверять) и проверяете байт адреса. Легко пишется, мне лень выбрать инструкции, все инструкции есть в тестах для ассемблеров (например, https://github.com/Clownacy/clownassembler/blob/master/tests/valid instructions.asm), должны сами осилить.
Почему-то думал, что Exodus точнее.
Exodus is one of the first emulators to attempt cycle accuracy at the high cost of system requirements, but it is no longer updated and far from complete. It is still somewhat useful as a reference for the Genesis hardware, but users will have a faster and more accurate experience with BlastEm or other recommended emulators for Genesis.

UPD3: Сделал пропуск кривых инструкций, пробовал на нечётном адресе и неправильной инструкции. Некоторые прерывания точно не работают. Положить к файлам из архива ром - input.gen, в файле shit_hack_remedy.asm указать адрес свободного места размером 0x36 байта вместо org $ (например, org $3FFF00) запустить compile_shit_hack_remedy.bat, на выходе - input_crash_handler.gen.
« Последнее редактирование: 28 Февраль 2024, 22:47:29 от Sharpnull »

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1159
    • ВКонтакте
    • Steam
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #207 : 28 Февраль 2024, 23:02:21 »
А в чем там проблема?
Во вступительном ролике игры на реальном железе, на 32-ой секунде попадание в байк и "Бум!" совпадают. И я ещё не видел эмулятора, в котором есть это совпадение. BlastEm меньше всего рассинхронизирован со звуком, из-за чего и делаю вывод, что он точнее всех.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 900
  • Happy Games Only!
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #208 : 01 Март 2024, 08:40:01 »
Sharpnull, извините, что не сразу ответил.

Можно. Составляете список нужных инструкций, в программу записываете их байты и смещение для проверочного байта, ищите каждые 2 байта по кратным 2 позициям в файле (хотя код может быть записан в RAM с нечётной позиции в роме, тогда каждый байт проверять) и проверяете байт адреса. Легко пишется, мне лень выбрать инструкции, все инструкции есть в тестах для ассемблеров (например, https://github.com/Clownacy/clownassembler/blob/master/tests/valid instructions.asm), должны сами осилить.
Не. вряд ли осилю.
Ошибки нужно исправлять, а не играть в говнохаки.
Да, я с вами согласен. Но просто всегда остается параноя, что какую-то еще ошибку не отловил. А с таким костылем, возможно, игра как-нибудь худо-бедно продолжит работать.
UPD3: Сделал пропуск кривых инструкций, пробовал на нечётном адресе и неправильной инструкции. Некоторые прерывания точно не работают. Положить к файлам из архива ром - input.gen, в файле shit_hack_remedy.asm указать адрес свободного места размером 0x36 байта вместо org $ (например, org $3FFF00) запустить compile_shit_hack_remedy.bat, на выходе - input_crash_handler.gen.
Спасибо. Попробовал. На Tiny Toon 3 заработало. После применения этого костыля игра начинает работать, даже если не NOPать инструкцию по адресу 0x226. Проверено на эмуляторе Exodus, а также на настоящей приставке. Конечно, я эту инструкцию потом заNOPал, но костыль в игре оставил, а то мало ли что, может там еще где-то есть "сюрпризы".

А вот на хаках Соника не работает - они просто виснут. Sharpnull, ой извините, нет, все работает. Попробовал еще раз - работает, игра не зависает после проблемного места и даже продолжает нормально работать. Видимо в первый раз что-то не так сделал. Единственное что, при прохождении проблемного места есть небольшое подтормаживание, но совершенно незначительное. Но это лучше, чем надпись "Address error" посреди экрана, необходимостьпрощелкивать и испорченная графика.

Правда на настоящей приставке все же может зависнуть, но не "гарантировано", чаще всего "прокатывает".

Sharpnull, вы - сверхразум.

Ещё BlastEm нацелен на точность, лучше и на нём всё проверять. Похоже, он единственный эмулятор, где не заставке Flashback картинка и звук совпадают почти как на реальной приставке.
Где-то Exodus все-таки лучше. Вот например, в сборнике хаков игр серии Sonic the Hedgehog от Razor-а нашел Sonic Megamix версии 3.5. До этого года даже не знал о такой версии, знал после третей только 4.0 и 5.0, но они уже для Mega CD. А этот похож на версию 4.0, но при этом запускается с картриджа, а в версии 3.0 были кое-какие моменты, которые не устраивали.

Попробовал запустить этот хак на приставке - картинка оказалась какой-то ужасно темной. После этого догадался скачать эмулятор Exodus (до этого проверял только на Gens) - там картинка такая же. А вот в BlastEm картинка нормальная, хотя настоящая приставка выдает темную.

Проблему кстати исправил - в Exodus открыл VDP Registers и начал там тыкать все галочки наугад. После одной картинка посветлела. Это был бит 2 из Mode Register 1. Во всплывающей подсказке было написано, что это какой-то непонятный незадокументированный режим, в котором используются только по одному биту из каждого цвета (красный, зеленый, синий), причем для нормальной работы этот бит должен быть установлен. Поискал, как к этому регистру обращаться. После некоторых мучений нашел, что там по всему ROM-у было разбросано:lea ($00c00004),A6
move.w #$8000,(A6)

Похоже на какое-то намеренное вредительство. Исправил все move.w #$8000,(A6) на move.w #$8004,(A6)
« Последнее редактирование: 01 Март 2024, 13:25:36 от Talking_Sword »

Оффлайн FireFox Фан

  • Пользователь
  • Сообщений: 1536
  • Пол: Мужской
  • Огнелис
    • ВКонтакте
    • Youtube
    • Просмотр профиля
[ALL] Вопросы новичков
« Ответ #209 : 29 Март 2024, 17:56:07 »
Доброго времени суток!

Я хочу вставить Русские версии в Teenage Mutant Ninja Turtles - The Cowabunga Collection, но консольные игры в bin. Я только Sega в таком формате находил. Но как преобразовать NES + GB + SNES?