Разработка и ромхакинг > Программирование
[SMD] Создание собственной многоигровки на одном чипе
SegaMark:
Можно ли реализовать многоигровку на перезаписываемом картридже?
Интересует именно программный способ, без каких-либо аппаратных изменений.
Возможно, кто-то уже сталкивался с этой задачей и есть идеи или готовые решения.
Некоторые эмуляторы (например, BizHawk) корректно работают с самодельными «многоигровками»: можно взять образ такого картриджа и заменить одну из игр на свою — и это будет работать.
Однако на реальном картридже такой подход, насколько я понимаю, не работает. Вероятно, проблема связана с адресацией: каждая игра «ожидает», что она загружается с начала адресного пространства, тогда как в многоигровом ROM она находится по смещению.
При этом в оригинальных многоигровых картриджах, судя по всему, проблема решается на уровне железа — за счёт использования отдельных чипов или специальной логики (mapper), которая подменяет адресацию и «подставляет» нужную игру как будто она начинается с нуля.
Отсюда вопрос:
существуют ли программные инструменты или методы, позволяющие переразметить ROM (изменить адресацию, точки входа и т.д.), чтобы игра могла корректно работать не с начала файла, а со смещением?
SeregaZ:
по моему если и сделаешь, то все, к примеру 4 игры - могут быть только в пределах 4 мегабайт в сумме. если по 1 мегабайту к примеру взять игры, то можно самому "запускатор" сделать. и просто потом джампами на нужные игры прыгать. но это надо будет чтоб все эти четыре игры были одного региона.
SegaMark:
мне и надо в пределах 4 мб разместить игры
--- Цитата: SeregaZ от 24 Март 2026, 17:32:17 ---если по 1 мегабайту к примеру взять игры, то можно самому "запускатор" сделать. и просто потом джампами на нужные игры прыгать.
--- Конец цитаты ---
Я делал что-то подобное, у готового меню менял адреса jmp, но это не работает на реальном железе, запуститься только та игра которая вначале Рома стоит. Или я что-то не так понял. Можешь по подробней рассказать.
--- Цитата: SeregaZ от 24 Март 2026, 17:32:17 ---но это надо будет чтоб все эти четыре игры были одного региона.
--- Конец цитаты ---
причем здесь регион? у меня есть многоигровки где у игр может быть разный регион
Talking_Sword:
--- Цитата: SegaMark от 24 Март 2026, 17:13:44 ---Можно ли реализовать многоигровку на перезаписываемом картридже?
Интересует именно программный способ, без каких-либо аппаратных изменений.
--- Конец цитаты ---
Чисто в теории можно "чисто программно", без каких-либо аппаратных изменений, но на практике это будет очень сложно, я бы с этим не связывался.
Нужно учитывать, что пираты все равно ставят в многоигровки Mega Drive схему переключения банков, значит, "чисто программный способ", как мне кажется, слишком сложный, иначе бы уже давно делали многоигровки для Mega Drive с одним лишь ПЗУ. Этим пиратам лишь бы на чем-то сэкономить. Раз не делают, значит есть сложности.
Сразу говорю, намного проще будет купить картидж с вот такой платой (смотрите фотографию в посте). Далее, вот стандартная схема переключения банков для многоигровок Mega Drive. Покупаете эти микросхемы в DIP-корпусах, сверлите отверстия в пластике на плате картриджа, в которые потом вставите микросхемы. То, что над текстолитом, это именно пластик, он нужен только для экономии текстолита, чтобы увиличить плату, чтобы она доставала до креплений, в нем ничего важного нет, его можно сверлить смело. Потом соединяете микросхемы согласно схеме с обратной стороны проводками. Там еще нужно обрезать дорожки от VA17-21, они пойдут через HC32.
Вторую HC174 ставить не нужно, она нужна только для многоигровок большого объема. На этой плате можно сделать картридж максимум 8 МБ, так как там микросхема в корпусе TSOP48, а они идут максимум 8 МБ.
P.S.: вы еще помучаетесь с самостоятельной сборкой многоигрового ROM-а, так как еще не написали сборщик многоигровых ROM-ов для Mega Drive, поэтому ROM придется собирать вручную, как это делал я.
Беларус:
Только если скомпилировать сборник из игр, которые кто-то дизасэмблировал или у которых есть исходники.
Можно ещё попробовать тупо сместить все абсолютные адреса в ромах :biggrin:
SeregaZ:
во во... утро вечера мудреннее - проснулся и понял что погорячился :) если первую игру можно втулить влегкую. то начиная со второй - надо будет ковырять все адреса и изменять. они-же по сути указаны от начала рома. бывают конечно относительные адреса и с ними проблем невозникнет. но вот абсолютные адреса... тут без правок не обойтись. то есть это надо игру разобрать, сделать резиновой и только тогда можно будет втулить в единый общий ром.
Томахомэ:
А как многоигровки вообще обходятся с векторами и обработчиками прерываний, которые у каждой игры разные?
SegaMark:
--- Цитата: Беларус учит русский от 24 Март 2026, 20:41:08 ---Можно ещё попробовать тупо сместить все абсолютные адреса в ромах
--- Конец цитаты ---
вот я об этом как раз и подумал в первую очередь. типа написать такую программу которая за тебя будет искать что нужно сместить и на сколько.
--- Цитата: Беларус учит русский от 24 Март 2026, 20:41:08 ---Только если скомпилировать сборник из игр, которые кто-то дизасэмблировал или у которых есть исходники.
--- Конец цитаты ---
ну это я так понял будет работать НЕ с ассемблерными исходниками, а например с исходниками на SGDK или BEX.
Мне кажется нельзя создать например многоигровку из исходников первого и второго Соника просто дописав меню.
SeregaZ:
ну поэксперементировать можно... какие есть самые галимые, то есть маленькие игры? и желательно простенькие.
SegaMark:
--- Цитата: SeregaZ от 25 Март 2026, 10:55:21 ---ну поэксперементировать можно... какие есть самые галимые, то есть маленькие игры? и желательно простенькие.
--- Конец цитаты ---
можно сначала здесь посмотреть https://github.com/And-0/awesome-megadrive?tab=readme-ov-file#open-source-games
или если хочешь вручную дизассемблировать то самые известные это: Alien 3, Rambo 3, streets of rage, flicky, sunset riders..
SeregaZ:
японских бох! никогда не думал что моя любимая Alien 3 всего 512 килобайт щасья :) Рэмбо так и вовсе 256. класс класс. будем посмотреть надосуге. заодно хоть повод будет свой дизассемблер забэкапить со старого компа :cool:
Беларус:
--- Цитата: SegaMark от 25 Март 2026, 10:53:38 ---написать такую программу которая за тебя будет искать что нужно сместить и на сколько
--- Конец цитаты ---
Простое решение, но, скорее всего, надо будет постоянно отлавливать и исправлять баги в игре, т.к. таким образом нельзя точно распознать адрес в роме, это можно только через дизасм. Takamura-kun вот дизасмит ромы быстро, но не знаю, делает ли он это на заказ.
--- Цитата: SegaMark от 25 Март 2026, 10:53:38 ---ну это я так понял будет работать НЕ с ассемблерными исходниками, а например с исходниками на SGDK или BEX.
Мне кажется нельзя создать например многоигровку из исходников первого и второго Соника просто дописав меню.
--- Конец цитаты ---
По идее, все компилятры должны давать выбрать начальный адрес будущего рома.
--- Цитата: Томахомэ от 25 Март 2026, 08:35:11 ---А как многоигровки вообще обходятся с векторами и обработчиками прерываний, которые у каждой игры разные?
--- Конец цитаты ---
Аппаратно проблемы быть не должно, раз многоигровки просто как бы переставляют картридж. А вот програмно уже действительно интересно, если проц смотрит вектры только от нулевово адреса и никак его не уговорить смотреть не там. Тут варианты - вместить трапы всех игр многоигровки:
$00 - Stack pointer
$04 - Code start
$08 - Bus error
$0C - Address error
$10 - Illegal instruction
$14 - Divistion by zero
$18 - CHK exception
$1C - TRAPV exception
$20 - Privilege violation
$24 - TRACE exeption
$28 - LINE 1010 EMULATOR
$2C - LINE 1111 EMULATOR
$30-$5F - Reserved by Motorola
$60 - Spurious exception
$64 - Interrupt request level 1
$68 - Interrupt request level 2
$6C - Interrupt request level 3
$70 - Interrupt request level 4 (VDP interrupt / Horizontal blank)
$74 - Interrupt request level 5
$78 - Interrupt request level 6 (Vertical blank)
$7C - Interrupt request level 7
$80 - TRAP #00 exception
$84 - TRAP #01 exception
$88 - TRAP #02 exception
$8C - TRAP #03 exception
$90 - TRAP #04 exception
$94 - TRAP #05 exception
$98 - TRAP #06 exception
$9C - TRAP #07 exception
$A0 - TRAP #08 exception
$A4 - TRAP #09 exception
$A8 - TRAP #10 exception
$AC - TRAP #11 exception
$B0 - TRAP #12 exception
$B4 - TRAP #13 exception
$B8 - TRAP #14 exception
$BC - TRAP #15 exception
$C0-$FF - Reserved by Motorola
Но тут я пока не разбираюсь и надо будет исправить в игре все инструкцыи TRAP на новое расположение в этом списке.
Или же записать тут адреса отдельного обработчика, который смотрит, что за игра его потревожила и выполнять код для него. Но это может сказаться на производительности. Например, Квакшот активно использует трапы при распаковке архивов, если правильно помню.
SeregaZ:
надо кароче однокликовый дизассемблер сделать. чтоб он сам формулы просчитывал, где адреса по формулам считаются. наугад тыркать кнопку С на неразмеченном участке кода - такая себе идея... он там разберет и что надо и что не надо :) так-же отчасти могла бы помочь некая эвристика, типа код разбирает, и сразу-же анализирует - адекватный ли это код, или абракадабра.
пока предлагаю на эти самые Трапы забить. SegaMark, ты Rambo III (W) (REV 01) [!] попробуй в иде поковырять. там что-то я помню эмулятор запускается и адреса после обратно в иду шлет, чтобы хоть отчасти полный дизасм сделать... надо кароче список адресов собрать в кучу, а после думать как зарезинить игру. причем не разбираясь это адрес для музыки или графики, или еще для чего... достаточно что просто на этот кусок рома какая-то часть кода ссылается. если хоть одну игру мы так зарезиним - то тогда уже про эти трапы можно будет думать.
Добавлено позже:
сижу тут разбираюсь в своем собственном дер... то есть коде. пытаюсь понять как ручную метку втулить, чтобы метка была как метка, без необходимости разбора кода. говорила мама - не забрасывай на год проект, все забудешь! не послушал :)
видимо надо чтоб дополнительное окошко вылазило с ручными метками, а там уже отмечать флагами какие метки не нужно разбирать. но блин, я не хочу вылазить за 1024х768, а места итак уже нет - под завязку все забито и всё нужное.
Добавлено позже:
и у меня затуп :blush:
мой чудо-дизассемблер рожает как:
and.w (pc,d0.w), d1 ; C27B
ASM68K.exe ругается: Illegal value (-1532)
в эмуляторе:
and.w $E2 (pc,d0), d1
как правильно? и откуда этот $E2 взялся...
Добавлено позже:
ога... с Е2 разобрались. мой косяк. надо же читать 2 следующих байта... пойду искать где это в коде и исправлять :blush:
Добавлено позже:
вроде поправил... но один хрен не собирает ASM68K.exe... ругается на негативное число. $E2 - ну как бы понятно, что меньше $7F... вот только чего он мне всю малину портит?
Ti_:
Соника делали 3 в 1:
https://www.emu-land.net/forum/index.php/topic,55005.0.html
Ещё официальные сборники есть Mega Games 6 (Vol 1 - Vol 3), Mega Games 1,2,3 , Mega Games 10 in 1 :
Mega Games 1 (Super Hang-on, Columns, World Cup Italia 90)
Mega Games 2 (Golden Axe, Streets of Rage, Revenge of Shinobi)
Mega Games 6 Volume 1 (all six titles in Mega Games 1 and 2)
Mega Games 6 Volume 2 (Sonic the Hedgehog, Streets of Rage, Columns, Sega Soccer, Super Monaco Grand Prix, Revenge of Shinobi)
Mega Games 4-in-1 (Gunstar Heroes, Flicky, Alex Kidd, Altered Beast - так же известная как Classic Collection 4-in-1 в США)
Mega Games 10-in-1 (Tec Toy выпустила в Португалии: Sonic, Super Shinobi, Super Monaco GP, и 7 других малоизвестных названий)
Genesis 6-Pak (Американская версия Mega Games 6 Volume 2 - те же игры, за исключением Super Monaco Grand Prix, замененной Super Hang-On)
SeregaZ:
все. я кароче как Виннипух... застрял :) ругается на
--- Код: ---and.w $E2(pc, d0.w), d1
--- Конец кода ---
и все прочие and такого-же типа с рс.
это сам ASM68K.exe гонит (ибо он и правда в некоторых вещах хромает) или все-таки я что-то навертел не то в своем дизассемблере?
Добавлено позже:
я тут проконсультировался у гугеля более пристрастно - надо кароче переделать. читая сырой байт данного опкода and - нужно не рисовать его как есть, а надо сразу расчитывать метку и добавлять её в дизасм. завтра попробую.
SegaMark:
--- Цитата: Ti_ от 26 Март 2026, 11:17:45 ---Соника делали 3 в 1:
https://www.emu-land.net/forum/index.php/topic,55005.0.html
--- Конец цитаты ---
Ух ты, это реально работает. Я записал картридж с этим РОМом и все три игры запустились. Я не успел подумать о таком сборнике а его уже сделали :thumbup:. Интересно как он этого добился o_0?
--- Цитата: Ti_ от 26 Март 2026, 11:17:45 ---Ещё официальные сборники есть Mega Games 6 (Vol 1 - Vol 3), Mega Games 1,2,3 , Mega Games 10 in 1 :
--- Конец цитаты ---
Буду теперь все эти проверять.
Интересно будет еще проверить. Будет ли работать если заменить игру, которая лежит первая в памяти
SeregaZ:
тем временем глянул в другом месте... а я уже такое оказывается делал :) просто получается для and недоделал... эм... ну тогда проще. оттуда копирнем и в and вставим :)
Ti_:
--- Цитата: SegaMark от 26 Март 2026, 14:52:38 ---Ух ты, это реально работает. Я записал картридж с этим РОМом и все три игры запустились. Я не успел подумать о таком сборнике а его уже сделали . Интересно как он этого добился ?
--- Конец цитаты ---
Соников давно дизассемблировали просто, что он и использовал.
На СОР1-2-3 также можно попробовать: https://github.com/gsaurus/sor-disassemblies/
SeregaZ:
и все равно я рад, что хоть маленько седня попрограммил :) кароче еще ошибку нашел... завтра исправлю. и еще адреса кучу нашел. тоже добавлю. старое вложение пока снесу за ненадобностью. завтра если доделаю приложу. а если оно еще и сдвинется из коробки, то буду писать кипятком от восторга. хотя сомневаюсь конечно что прям из коробки сработает. обычные move то останутся без изменений... но я надеюсь что хотя-бы запустится начальная заставка или что-то в этом роде. это будет уже успех.
Беларус:
--- Цитата: Ti_ от 26 Март 2026, 11:17:45 ---официальные сборники есть
--- Конец цитаты ---
Вот это интересно :ohmy:
Я сравнил некоторые игры этих сборников и увидел, что различаются только адреса. Т.е. изучив эти смещения можно делать из них сборники игр. Ещё это облегчает их декомпиляцию и дизасм :thumbup:
Вот все сборники для Сеги:
Mega Games I, 2, 3, 6, 6 (Vol. 2, Vol. 3), 10, 6-Pak, Sega Top Five, Sonic Classics, Sega Sports 1, Classic Collection, The Disney Collection
Навигация
Перейти к полной версии