Небольшое руководство по созданию картриджа, содержащего 8 игр с встроенным меню выбора и встраиванию кода меню в другую игру с помощью hex редактора.
В приложенном файле Rambo-menu-short.bin игра Rambo 3 расположена в первых 256Кб, код меню во вторых 256Кб начиная с адреса
40000. Редактируемый список игр находится по адресу
41140. Список из 7 добавляемых игр должен быть подобран таким образом, чтобы все они были одинаковые по объему, напр. все 512KB, 1MB, 2MB, 4MB. Также надо учитывать какую память вы сможете использовать при создании многоигровки 512КВх8=4МВ (S29GL32), 8МБ(S29GL64), 16MB (S29GL128), 32MB (S29GL256).
Минимальный порядок действий будет выглядеть следующим образом:
1. Подбираем 7 игр одинакового размера по объему,
2. С помощью hex редактора редактируем список игр по адресу
41140,
3. Если нужно, увеличиваем файл Rambo-menu-short.bin до размера подобранных игр, заполняя пустое пространство FF,
4. С помощью того же hex редактора собираем все игры в один файл, выставляя их по порядку как в меню. Важно, чтобы первым всегда был файл Rambo-menu-short.bin, несмотря на то, что в списке меню Rambo 3 на последнем месте. В качестве альтернативы hex редактору можно использовать программу Megadrive Rom Maker, либо другой удобный способ,
5. Выполняем swap bin и записываем на флэшку,
6. Собираем картридж по схеме с 74HC174 и играем.
Чтобы игра Rambo 3 не повторялась в каждой восьмиигровке, попробуем встроить код меню в другую игру - возьмем Contra - Hard Corps. Весь код меню занимает 4704 байта, нам надо найти в коде игры неиспользуемое пространство не менее данного размера, как правило такие участки заполнены FF. Посмотрев с конца файла, я выбрал участок, начинающийся с адреса
1FBF00. Сюда и вставляем код меню из Rambo-menu-short.bin начиная с адреса
40000 и до
4125F.
Теперь идем в самое начало файла Contra - Hard Corps и смотрим, что записано по адресам 05, 06, 07 –
000200, запомним данное значение, оно нам еще понадобится. Теперь вместо него пишем адрес начала кода меню
1FBF00.
Теперь при старте многоигровка будет показывать меню. Далее перемещаемся к адресу
1FC7B4 и вместо
0D7E пишем адрес который мы заменили в начале файла
0200.
Всё, теперь при выборе восьмого пункта меню у нас будет запускаться Contra - Hard Corps. Т.к. мы внесли изменения в код игры, необходимо исправить контрольную сумму с помощью Megadrive Rom Maker или Sega Genesis ROM Analyzer, после чего можно проверить работу меню в эмуляторе и собирать многоигровку.
Для переключения игр в картридже используется 74HC174 (74LS174). Контакты разъема соединяем с HC174: А17 (VA1) – 3 нога (D0), А15 (VA2) – 4 нога (D1), А13 (VA3) – 6 нога (D3), В27 (VRES) – 1 нога (Mr), B31 (TIME) – 9 нога (Cp). Выводы HC174 соединяем со старшими адресами флэш-памяти, например, для S29GL64: 2 нога (Q0) – 9 нога (А19), 5 нога (Q1) – 10 нога (А20), 7 нога (Q2) – 13 нога (А21). Выводы 10-15 HC174 не задействованы (возможно входы D3, D4, D5 надо притянуть к земле, пусть меня знающие люди поправят).
PS спасибо
DrMefistO за Smd IDA Tools, благодаря которым я разобрался в модификации исходного меню, для меня это был первый опыт в работе с дизассемблером.