Comments 77
А нельзя ли автоматизировать подход, путем поиска опкода инструкции по записи в память? Возможны, конечно, ложные срабатывания, но, думаю, что это сильно сузит круг подозреваемых мапперов, особенно для опытного специалиста. Можно вообще даже сделать эвристику, зная то, как ведут себя извесные мапперы.
P.S.: Я имею ввиду автоматизированный подход без использования дизассемблера
P.S.: Я имею ввиду автоматизированный подход без использования дизассемблера
Там могут быть очень хитрые условия переключения банков. Но если заранее знать, что в картридже стоит какой-то из популярных мапперов, то теоретически можно сделать. Но в таких случаях проще перебором.
Я так понимаю, что в любом случае переключение осуществляется через запись в память, поэтому отправная точка — это поиск этого места в бинарном коде.
Ну и ламерский вопрос: а взор с лупой на микросхему не даёт ответа на этот вопрос?
Ну и ламерский вопрос: а взор с лупой на микросхему не даёт ответа на этот вопрос?
Санчез просил показать :)
www.youtube.com/watch?v=jnOPwUJCvmQ
www.youtube.com/watch?v=wRORWjdERcU
www.youtube.com/watch?v=fSX9N9Sq_sA
Не знаю, как именно он всё это делает. Видно, что кеширует данные, но непонятно, как именно он отслеживает, когда банк переключился.
www.youtube.com/watch?v=jnOPwUJCvmQ
www.youtube.com/watch?v=wRORWjdERcU
www.youtube.com/watch?v=fSX9N9Sq_sA
Не знаю, как именно он всё это делает. Видно, что кеширует данные, но непонятно, как именно он отслеживает, когда банк переключился.
Там походу эмулятор исполняет игру, и когда случается write, эмулятор прерывается даёт сигнал дамперу о том, что появился новый банк.
Запись в память картриджа не всегда переключает банки, иногда это может делаться много раз в секунду. И не только запись в область картриджа может переключать банки.
Да, но видимо эмулятор знает про разные типы эмуляторов и фильтрует неимеющие к переключению банков записи.
Так смысл тогда теряется, если эмулятор знает :) В таком случае проще картридж целиком сдампить и эмулировать. Ретрон вроде так и делает.
Как это смысл теряется? Эмулятор тут как раз вспомогательный инструмент для того, чтобы сдампить картридж и не ковыряться в ассемблере.
Вы противоречите сами себе. Если софт уже знает маппер, то уже не нужно ни ковыряться в ассемблере, ни использовать эмулятор. А если не знает, то возникает вышеописанная проблема.
Секундочку. Софт не знает маппер априори. Но может догадаться эвристически, зная как управляются известные софту мапперы и видя как и куда происходит запись. Это можно автоматизировать. А руками и глазками придется искать дольше.
Ха, вот это мой девайс. С эмулем все как раз просто: программа сама говорит когда и что записать, Копифамиклон просто пересылает в эмуль изменившиеся данные. Так как это требует некоторого времени, эмулятор их кеширует. Так что самый 100% вариант дампинга неизвестной игры — прогнать ее на таком устройстве. С другой стороны, в игре могут быть неиспользуемые блоки или для дампинга некоторых придется пройти всю игру.
А как оно узнаёт, когда данные изменились? Устройство держит в себе какой-то кеш и уведомляет эмулятор при изменении данных? Эмулятор же в таком случае должен каждый раз к железу обращаться, разве нет? Или проверка идёт только после записи в 0x6000-0xFFFF?
Никакого кэша в железе. Действительно, в эмуляторе ведется мониторинг записи в адреса 0x6000-0xFFFF, при обнаружении таковой, эмуляция ставится на паузу и делается подобная запись на копифамиклоне. Затем вычитывается новое состояние, которое кэшируется эмулятором. И так до следующей записи.
Но этот метод не является 100% универсальным. И для полноценного дампа надо же всё равно вручную разбираться в принципах работы маппера.
Он таки как раз универсален и не зависит от маппера вообще. А вот 100% полноту дампа не гарантирует, о чем я и сказал выше.
А вы не имели опыта «пересадки» палитры? Я знаю из какой игры заставка в последней многоигровке — это «Король Лев» для сеги и там нормальные цвета, есть пиратский порт на фамиком — но там цвета тихий ужас (подозреваю что пираты повредили палитру), я все пытался — но неосилил.
А на NES скорее всего красивее и не сделать из-за ограничений палитры. В пиратском порте Короля Льва на NES вроде такие же цвета, если мне память не изменяет.
UFO just landed and posted this here
Именно пиратского порта со SNES? У меня есть, есть ещё порт на MMC3.
Есть — вечером могу скинуть, на NESTOPIA идет на ура, но там явно «битая» палитра, Игра выглядет по краскам где-то уровня 2600 атари.
UFO just landed and posted this here
Вот этот дамп.
vk.com/doc29443603_361179277
vk.com/doc29443603_361179277
По ссылке ниже ужаснейший официальный порт с геймбоя. Это очень странный случай, когда пиратский порт на голову выше по качеству.
У меня есть порты от конторы «Supergame». Если надо, пишите в личку.
У меня есть порты от конторы «Supergame». Если надо, пишите в личку.
Шикарно! Спасибо. Сильно ли отличаются картриджи для Sega, SNES, N64?
Помню, в 90х годах я сдампил один многоигровой картридж с маппером. Шел тем путем, как описанные в статье первопроходцы: сначала сдампил первый банк, потом продизассемблировал его (код меню выбора и запуска игры). Нашел, как программируется маппер и тогда уже считал (подключив картридж через переходник к программатору УФППЗУ) из него все данные. Получилось 256Кб, из них 128 — графика.
При этом дизассемблер 6502 был собственной разработки. Он работал на ZX Spectrum (кросс-дизассемблер). Все это делалось в рамках проекта «контроллер дисковода для Dendy». Проект так и не был завершен, не в последнюю очередь — из-за мапперов и прочей аппаратуры, которую ставили на картриджи и которую никак нельзя было в универсальном виде поставить на контроллер дисковода. Ну и из-за обнаружившейся чрезвычайной трудоемкости считывания и адаптации картриджей. Над каждым пришлось бы корпеть днями.
При этом дизассемблер 6502 был собственной разработки. Он работал на ZX Spectrum (кросс-дизассемблер). Все это делалось в рамках проекта «контроллер дисковода для Dendy». Проект так и не был завершен, не в последнюю очередь — из-за мапперов и прочей аппаратуры, которую ставили на картриджи и которую никак нельзя было в универсальном виде поставить на контроллер дисковода. Ну и из-за обнаружившейся чрезвычайной трудоемкости считывания и адаптации картриджей. Над каждым пришлось бы корпеть днями.
О, спасибо! Первая интересная статья в этом году.
Отличная статья!
Кстати, не помешал бы мощный холивар на хабре на тему рейтинга консольных игр. У меня сейчас в PSP почти всё, кроме NeoGeo. Реально доставляет запускать игру 1981 года и играть, получая удовольствие. Ъ игр уже почти не делают.
Кстати, не помешал бы мощный холивар на хабре на тему рейтинга консольных игр. У меня сейчас в PSP почти всё, кроме NeoGeo. Реально доставляет запускать игру 1981 года и играть, получая удовольствие. Ъ игр уже почти не делают.
Инетесно :) не только статьи Ализара угадываются по заголовку
Огромное спасибо!
А сделали бы адресацию сразу 32-х битной и проблемы бы такой не было как класса.
P.S.
Будешь много играть на приставке — сядет трубка :P
P.S.
32-х битная шина на 6502 и в 1983м году? Тогда очень важно было сделать игровую консоль дешёвой.
640кб хватит всем!
Вы не поверите, хватало. И игрушки были загляденье. А попроси среднего современного тыжпрограммиста написать игру, уложившись в 32К?
Я знаю о чем речь(у меня был Pentagon128, ещё можно заглянуть мне в профиль), но
А сделали бы адресацию сразу 32-х битной и проблемы бы такой не было как класса.звучит подобно
640кб хватит всем!, однако теперь нам и 32-х битов не хватает :)
Дайте мне прямой доступ к оборудованию, чтоб ОС не мешалась, и 16-разрядный код, чтоб команды много места не жрали — и можно даже в 4к уложиться. За примерами далеко ходить не надо, под DOS и сейчас средней криворукости кодер не то что на ASM'е — даже на Turbo Pascal 7.0 может написать простенькую игрушку, уложившись в 32к.
В начале даём:
потом:
Ну и дальше как-то через
Минимум документации (всего пара книжек), минимум кодерского скилла — и оно легко напишется и будет работать. ИМХО даже проще и понятнее, чем инициализировать DirectX или написать шейдера в WebGL.
Недаром же говорят — если хочешь уменьшить размер программы минимум на порядок, начни с того, что выкинь все фреймворки.
В начале даём:
{$A-,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V+,X+}
{$M 16384,0,655360}
потом:
asm mov ax,13h int 10h
Ну и дальше как-то через
mem[$A000:i]:=...
Минимум документации (всего пара книжек), минимум кодерского скилла — и оно легко напишется и будет работать. ИМХО даже проще и понятнее, чем инициализировать DirectX или написать шейдера в WebGL.
Недаром же говорят — если хочешь уменьшить размер программы минимум на порядок, начни с того, что выкинь все фреймворки.
Очень интересная статья! Спасибо. А какие ваши дальнейшие планы на статьи/ видео? В принципе, с удовольствие посмотрел бы на разработку клона nes/famicom хоть на ориганальном железе, хоть на плис:) касательно первопроходцев — если речь о тех, кто спиративал игры. То, думаю там в большинстве случаев было завладевание исходных кодов игр. Иначе как объяснить всяческие изменения в число жизней, замену текстур и т.д. Не диссасемблили же они игры) второй вариант — тупо считывали 2 пзушки и перезаписывали их.
Про дальнейшие планы пока секрет.
Конечно дизассемблировали. По вашей логике у создателей Game Genie должны были быть исходные коды абсолютно всех игр, ведь именно они были первоисточником всех патчей в те годы. Да и не было бы особого смысла в исходниках, они всё равно на ассемблере писались. Текстуры же легко заменяются без изменения кода игры.
Конечно дизассемблировали. По вашей логике у создателей Game Genie должны были быть исходные коды абсолютно всех игр, ведь именно они были первоисточником всех патчей в те годы. Да и не было бы особого смысла в исходниках, они всё равно на ассемблере писались. Текстуры же легко заменяются без изменения кода игры.
Про текстуры плохой пример — согласен.
Просто, например, зачем потенциальному пирату лезть в код игры, если он может скопировать ROM и реверснуть плату картриджа. Это кажется как-то более простым.
Дизассемблерованный код изучать — не самое приятное занятие.
Это так — просто мысли. Я картриджами для NES особо не интересовался ранее.
Просто, например, зачем потенциальному пирату лезть в код игры, если он может скопировать ROM и реверснуть плату картриджа. Это кажется как-то более простым.
Дизассемблерованный код изучать — не самое приятное занятие.
Это так — просто мысли. Я картриджами для NES особо не интересовался ранее.
Здесь категорически не хватает уютненьго одного известного дампера — cah4e3.shedevr.org.ru/dumping_2015.php
До Санчеза мне явно далеко. На мои просьбы о помощи он отреагировал как-то неоднозначно…
Это одиозная фигура, получившая широкую известность еще в те далёкие времена, когда ромы лежали только на pristavka.kulichki.net, a цвет эму-сцены обитал исключительно на emu-russia.km.ru/forum. И даже тогда Санч был не сильно охоч к помощи новичкам. Сейчас он активно принимает участие в разработке Demul и даже там резко отсекает любое проявление некомпетентности в вопросах Dreamcast.
К сожалению, те люди, которые легко уживались с нубасами на эмураше сейчас воспринимают современных новичков весьма враждебно.
К сожалению, те люди, которые легко уживались с нубасами на эмураше сейчас воспринимают современных новичков весьма враждебно.
Кстати, интересно, по какому алгоритму из двух ромов склеивается файл .nes?
Там сначала идёт простенький заголовок на 16 байт, в котором указывается маппер, мирроринг, размер программной памяти, размер памяти с изображениями и прочие параметры. После него идут все данные по очереди. Погуглите структуру NES-файла, там ничего особенного.
Вот тут у меня класс, который разбирает и собирает nes-файлы: github.com/ClusterM/famicom-dumper-client/blob/master/NesFile.cs
Вот тут у меня класс, который разбирает и собирает nes-файлы: github.com/ClusterM/famicom-dumper-client/blob/master/NesFile.cs
Понял, спасибо!
А поясните, пожалуйста, для чего в NES-файле вообще указывать маппер? Ведь у эмуляторов нет ограничений по разрядности шины и данные в NES хранятся, насколько я понимаю, не постранично, а сплошным потоком.
Круто. А вот нельзя ли сделать наоборот? Например: В офис программеров-олдфагов, выросших на денди, покупается теплая ламповая приставка. Но где брать картриджи? В сети полно дампов. Может ли быть некое устройство, с одной стороны которого втыкается флешка с дампами, а другой стороной устройство вставляется в приставку?
Да, можно. Я хотел сделать что-то подобное, да что уж там, до сих пор хочу. Приставка, пусть и китайский клон всё же как-то теплее и ламповее эмуляторов. Но вот со временем плохо.
Само устройство-то не сложное — считываешь файл рома, по запросу приставки отдаёшь ей данные.
Есть нюанс с мапперами, которые необходимо эмулировать. Впрочем, если ром играется на эмуляторе, значит, маппер известен как минимум этому эмулятору. Т.е. информацию найти можно.
Ещё нюанс — выбор игры. Не скажу, что не решаемая проблема, но нужно написать как-минимум авто-генератор меню со списком файлов. А для этого уже требуются более глубокие знания, чем «протокол обмена информацией картриджа с приставкой».
Хотя это всё теория.
Само устройство-то не сложное — считываешь файл рома, по запросу приставки отдаёшь ей данные.
Есть нюанс с мапперами, которые необходимо эмулировать. Впрочем, если ром играется на эмуляторе, значит, маппер известен как минимум этому эмулятору. Т.е. информацию найти можно.
Ещё нюанс — выбор игры. Не скажу, что не решаемая проблема, но нужно написать как-минимум авто-генератор меню со списком файлов. А для этого уже требуются более глубокие знания, чем «протокол обмена информацией картриджа с приставкой».
Хотя это всё теория.
Так есть уже. stuffpoint.ru/index.php?route=product/category&path=60 например. Только стоит заоблачно (и у китайцев не дешевле)
да, что-то с ценами у них беда прям. И список поддерживаемых мапперов небольшой
Ну, 135 мапперов поддерживается, 86 — нет. Не так и мало. (плюс, говорят, мапперы реализованы в софте => могут добавляться)
Курс вырос же.
Брал в прошлом году там версии для Famicom и для Sega Genesis — пока на данный момент это самые функциональные картриджи.
Для NES еще есть российская разработка: ramfactory.com/
Ну и на их форуме можно почитать по поддержке мапперов.
Ценник немного меньше, но все равно не маленький.
Брал в прошлом году там версии для Famicom и для Sega Genesis — пока на данный момент это самые функциональные картриджи.
Для NES еще есть российская разработка: ramfactory.com/
Ну и на их форуме можно почитать по поддержке мапперов.
Ценник немного меньше, но все равно не маленький.
Что-то не вижу у них для NES, только для SNES и Megadrive
На форуме читал про версию для Famicom
Например ramfactory.com/forum/viewtopic.php?t=793
Например ramfactory.com/forum/viewtopic.php?t=793
У меня значительно дешевле по деталям получается, если без мультирома. Хотя зачем мультиром на домашней консоли — я не знаю.
Вся прелесть в поддержке довольно большого количества мапперов.
И удобстве использования.
Залил на карту ромы, вставил в консоль и играешь.
И удобстве использования.
Залил на карту ромы, вставил в консоль и играешь.
Поддержку нужного маппера самому сделать не сложно, они все отлично документированы.
Мультиром удобен для посиделок с друзьями. Если играть самому, то обычно достаточно записать какую-то одну игру.
Мультиром удобен для посиделок с друзьями. Если играть самому, то обычно достаточно записать какую-то одну игру.
Всё будет. Нам же ещё много серий для шоу снимать, а вы хотите всё и сразу :)
UFO just landed and posted this here
Аппаратно тоже: forums.nesdev.com/viewtopic.php?t=8781
Можно и аппаратно. Иногда разбираешь картридж и видишь, что на нем, кроме «капель-ПЗУ», стоит микросхема — регистр. Можно бывает проследить связи регистра с сигналами и понять, как он управляется. Но в общем случае маппер может быть встроен в ту же каплю, где находится ПЗУ. Такое аппаратному реверсу тоже подлежит, но гораздо более затратно и трудоемко, чем дизассемблер.
Отлично. Очень хорошо выдержан баланс глубины изложения, при высоком уровне технической грамотности. Невозможно даже представить, что бы в современных СМИ появилось бы нечто подобное. Вам точно стоит развивать направление технического видеоблоггинга.
А возможно ли подключить картридж не к USB, а к LPT-порту? Это позволило бы сэкономить на микроконтроллерах и не связываться с разводкой платы.
Sign up to leave a comment.
Снимаем образы с картриджей для Dendy/Famicom/NES