Разработка и ромхакинг > Программирование
[SMD] Создание собственной многоигровки на одном чипе
(1/5) > >>
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
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии