| Разработка и ромхакинг > Ромхакинг |
| Вопросы новичков |
| << < (9/22) > >> |
| Sharpnull:
Talking_Sword, запуск рома с начального банка от Kid Chameleon, поэтому указывается адрес на код, который переключает банки на меню, иначе в банках останется Kid Chameleon. При замене Kid Chameleon вам нужно снова ставить адрес 00 3F 03 00. UPD: Так как нужен начальный адрес 1-й игры чтобы её запустить, он хранится в коде меню - 0x3F06F4 в роме, для Kid Chameleon там 00 00 04 B0, а для заменяемой игры нужно взять с позиции 0x4-0x7 от его рома. Другие начальные адреса тоже могут хранится в меню, но такое не нужно. UPD2: Они всё-таки не тупые, нужно менять только для 1-й игры: --- Код: ---2078 0004 movea.l $00000004,a0 4ED0 jmp.l (a0) --- Конец кода --- |
| Talking_Sword:
В принципе, до того, как писал сообщение догадывался, что что это как-то связано с переключением на меню. сейчас проверил - после подачи питания на выводах Q1-Q6 74LS174 действительно нули, значит будет включен банк самой первой игры. Значит эти изменения нужны, чтобы на выходах 74LS174 было 111111? Тогда не понимаю другого. Уже до этого экспериментировал - игры переключаются по сигналу /TIME, прочитал здесь, что сигнал /TIME срабатывает при доступе к адресам 0xA13000-0xA130FF. Поставил в отладчике точку останова на доступ к этим адресам, пробовал запускать меню отдельно (вырезанное из ROM-а). При выборе игры в меню, точка останова срабатывает. Но вот если запустить этот самый Kid Chameleon, у которого в начале 3F 03 00, то точка останова не срабатывает. |
| Sharpnull:
--- Цитата: Talking_Sword от 15 Май 2023, 17:56:48 ---прочитал здесь, что сигнал /TIME срабатывает при доступе к адресам 0xA13000-0xA130FF --- Конец цитаты --- Я давал ссылку на код эмулятора, там действительно читается A13000-A130FF. Интересно, что OR (ИЛИ) с базовым индексом банка, поэтому 0xA1307E, который переключает на меню установит все банки одним банком меню (каждые 64КБ). --- Цитата: Talking_Sword от 15 Май 2023, 17:56:48 ---Поставил в отладчике точку останова на доступ к этим адресам, пробовал запускать меню отдельно (вырезанное из ROM-а). При выборе игры в меню, точка останова срабатывает. Но вот если запустить этот самый Kid Chameleon, у которого в начале 3F 03 00, то точка останова не срабатывает. --- Конец цитаты --- Не знаю каким эмулятором вы пользуетесь, но в вырезке только нет первого чтения A1307E (для меню). Код чтения A130xx выполняется в RAM по понятной причине, может это вас сбило. |
| Talking_Sword:
Sharpnull, честно говоря, с трудом могу понять что написано в вашем сообщении. Сразу говорю, вовсе не имею в виду, что вы плохо пишете, просто умений в этой области у меня нет. Лучше спрошу так: 1. Чтобы заменить первую игру на многоигровке, нужно в "новой" игре значение по адресам 0x04-0x07 заменть на значение из "родной" игры? 2. А в коде меню что-то менять придется? Ну кроме текста, естественно. --- Цитата: Sharpnull от 15 Май 2023, 20:27:28 ---Не знаю каким эмулятором вы пользуетесь --- Конец цитаты --- Gens r57shell mod. |
| Sharpnull:
--- Цитата: Talking_Sword от 16 Май 2023, 14:16:39 ---1. Чтобы заменить первую игру на многоигровке, нужно в "новой" игре значение по адресам 0x04-0x07 заменть на значение из "родной" игры? --- Конец цитаты --- Допустим вы не будете заменять на игру больше 1МиБ с позиции 0x0 (т. е. вместо Kid Chameleon, конечно можно меньше без доп. изменений или сделать все игры разного размера при редактировании кода), тогда после вставки нового рома как минимум нужно: на место 0x4-0x7: 00 3F 03 00 (для меню), а байты, что были на месте 0x4-0x7 от "новой игры", скопировать с 0x3F06F4 (UPD: т. е. в это место), например у Kid Chameleon это было 00 00 04 B0. Второе нужно чтобы меню при выборе 1-й игры перекинуло на код "новой игры". --- Цитата: Talking_Sword от 16 Май 2023, 14:16:39 ---Gens r57shell mod. --- Конец цитаты --- Я тоже им пользуюсь по безысходности, много чего нет и пара инструкций неправильно отображаются в M68k Debug, как раз здесь код выполняемый в RAM не отображается, ещё последняя версия в сети без исходного кода - Gens11svnr665. Ну так он не запускает "Sega Radica! Volume 1 BIOS (U).gen", не поддерживает маппер, я подумал вы запустили эмулятор, он дошёл до меню, но там почему-то не сработал breakpoint при выборе игры. Обрезок только из меню работает, потому что регистр маппера используется при выборе игры, а в начале не нужно переключаться. Кстати, я не понимаю почему меню расположили в конце из-за чего нужно 1-ю игру редактировать, от Radica есть многоигровка где меню в начале и ничего переключать не нужно. Я только предполагаю для удобства, что в начале файле, или чтобы легко кто-то не достал их меню для своих игр, но вряд ли. Можно было бы сделать круче: на железе с маппером меню и все игры, а без маппера запуск 1-й игры без меню и без других игр. |
| Talking_Sword:
--- Цитата: Sharpnull от 16 Май 2023, 16:25:48 ---а байты, что были на месте 0x4-0x7 от "новой игры", скопировать с 0x3F06F4 (UPD: т. е. в это место), например у Kid Chameleon это было 00 00 04 B0. --- Конец цитаты --- 0x3F06F4 - это по идее адрес в области меню, то есть само меню тоже нужно править. Боюсь, что не получится у меня заменить первую игру. С другой стороны, на замену можно попробовать подобрать игру, у которой это значение будет как и у старой игры, тогда и надобность в редактировании кода меню отпадет. |
| Sharpnull:
--- Цитата: Talking_Sword от 16 Май 2023, 21:34:35 ---С другой стороны, на замену можно попробовать подобрать игру, у которой это значение будет как и у старой игры, тогда и надобность в редактировании кода меню отпадет. --- Конец цитаты --- Проверил 1699 ромов No-Intro (старый ромсет), подходит только Chameleon Kid (Japan).md :) Если речь про другую многоигровку, то как повезёт. |
| Talking_Sword:
--- Цитата: Sharpnull от 17 Май 2023, 06:36:12 ---Если речь про другую многоигровку --- Конец цитаты --- Да. Как уже говорил, мне нужно заменить игры на другой многоигровке, ROM Sega Radica использовал только для того, чтобы потренироавться, ROM-а нужной мне многоигровки у меня нет "на руках", так как пока нет программатора (но скоро будет), чтобы сдампить свою многоигровку. В моей многоигровке первым, скорее всего, будет Ultimate Mortal Kombat 3. Его можно будет заменить на на Toy Story, так как подходит по размеру. Посмотрел - и там, и там значения совпадают - 00 00 02 00. --- Цитата: Sharpnull от 17 Май 2023, 06:36:12 ---Проверил 1699 ромов No-Intro (старый ромсет) --- Конец цитаты --- Ради моих вопросов это слишком большие трудозатраты. Надо было мне сразу написать, что Radica не нужна. |
| Sharpnull:
--- Цитата: Talking_Sword от 17 Май 2023, 10:48:10 ---Ради моих вопросов это слишком большие трудозатраты --- Конец цитаты --- Мне было интересно, для 00 00 02 00 - 943 из 1699, вот скрипт на Python 3: --- Код: ---from pathlib import Path from itertools import chain START_ADDRESS = bytes.fromhex("00 00 02 00") c_all = 0 c_good = 0 cur_p = Path(".") for p in chain(*[cur_p.glob(s) for s in ("*.md", "*.gen", "*.bin")]): b = p.read_bytes()[0x4:0x8] if b == START_ADDRESS: c_good += 1 print(p) c_all += 1 print(f"All: {c_all}, Target: {c_good}") input("Press any key...") --- Конец кода --- Класть в папку с ромами, отобразит все подходящие ромы. |
| free.gen:
Хочу изменить кое какую отсебятину в переводе игры Crusader of Centy [SMD]. Текст оригинала (U) удалось найти с помощью Translhextion, там все буквально в пару кликов через Scan Relative. Находит закодированный текст и создает таблицу. А вот с переведенной версией он уже не хочет искать ничего (В поиск ввожу кириллицу). Выделяет не то что нужно. То есть как бы не находит этот переведенный текст, как в оригинале. Может что-то не так делаю? В настройках пробовал менять кодировку, все равно не ищет. Хочу сделать правильную таблицу для этого перевода, так чтобы в редакторе все отображалось как и в игре - на русском. Это возможно? Прошу советов и тд, как лучше и проще это все сделать. |
| Sharpnull:
--- Цитата: free.gen от 21 Май 2023, 18:09:33 ---Хочу сделать правильную таблицу для этого перевода --- Конец цитаты --- Для диалогов графика шрифта с F5000 - 8x16px, 1bpp. Из CrystalTile2: |
| free.gen:
Sharpnull, действительно, сам не допер просто сопоставить шрифты. :blush: Таблица готова, однако все равно в Translhextion кракозябры и пробелы. Отображаются только спецсимволы. Разобрался. Таблицу нужно создать в кодировке OEM 866. Спасибо. |
| Talking_Sword:
Есть вопрос, но он с некоторым уклоном в железо, не совсем уверен, будет ли это уместно в этой теме. Программы для работы с файлами на компьютере, такие как HEX-редакторы в основном оперируют байтами, в которых 8 бит, соответственно, конкретный адрес в файле указывает на конкретный байт. Но есть ПЗУ с 16-битной шиной, у них на одном адресе "лежит" уже 16 бит, получается что адресов будет меньше в два раза. Как перевести адрес из файла в адрес, который будет на шине адреса ПЗУ и обратно? Просто поделить на 2? А если нужно наоборот, перевести адрес из ПЗУ в адрес в файле, то умножить на 2? |
| Беларус:
Действительно, слишком железно, слишком непонятно. --- Цитата: Talking_Sword от 16 Июнь 2023, 06:54:22 ---конкретный адрес в файле указывает на конкретный байт. --- Конец цитаты --- Этот адрес может состоять из любого количества байт - 1, 2, 4, 8. Он может быть с "большим" удобством для глаз (Big Endian - 1234), а может быть с "маленьким" (Little Endian - 3412). --- Цитата: Talking_Sword от 16 Июнь 2023, 06:54:22 ---есть ПЗУ с 16-битной шиной, у них на одном адресе "лежит" уже 16 бит, получается что адресов будет меньше в два раза. --- Конец цитаты --- Т.е. к таким ПЗУ можно обращаться только по адресам, кратным двум байтам? Судя по твоим сообщениям, это связано с Сегой? --- Цитата: Talking_Sword от 16 Июнь 2023, 06:54:22 ---Как перевести адрес из файла в адрес, который будет на шине адреса ПЗУ и обратно? --- Конец цитаты --- Т.е. в файле адрес однобайтный? И не достаточно расширить его до двух байт, заполнив второй нулём? Скорее всего, тебе к Кластеру (на Хабре). |
| Talking_Sword:
--- Цитата: perfect_genius от 17 Июнь 2023, 00:45:07 ---Действительно, слишком железно, слишком непонятно. --- Конец цитаты --- Ну вот смотрите. Вот у нас есть ПЗУ. Пускай это будет S29GL512P: У него есть адресные выводы - A0-A24, на них можно в двоичном виде выставить адрес. Данные будут выдаваться на шине данных - DQ0-DQ15. Всего адресных выводов получается 25 (так как нумерация с нуля) 2^25 получается 33554432, 32 миллиона, но вмещает наше ПЗУ 64 мегабайта, то есть байт в два раза больше, чем адресов, но выводов данных у нас 16, поэтому на них будет сразу два байта. Нельзя просто так взять адрес из HEX-редактора и выставить его на шине адреса, чтобы получить нужные данные. В HEX-редакторе крайний адрес будет 3FFFFFF, на S29GL512P адрес будет 1FFFFFF (если перевести из двоичного в шестнадцатеричное). Нужно понять, как "перевести" значение адреса из файла, чтобы его можно было выставить на шине адреса ПЗУ, чтобы получить те же данные. --- Цитата: perfect_genius от 17 Июнь 2023, 00:45:07 ---Т.е. к таким ПЗУ можно обращаться только по адресам, кратным двум байтам? --- Конец цитаты --- Не знаю. --- Цитата: perfect_genius от 17 Июнь 2023, 00:45:07 ---Судя по твоим сообщениям, это связано с Сегой? --- Конец цитаты --- Да. |
| Марат:
Насколько я понимаю шина данных в 16 бит, лишь означает, что можно считывать/записывать сразу два байта за одну операцию. А можно и по одному байту читать/записывать. А если адресов не хватает, видимо, есть какой то маппер, который переключает банки. Добавлено позже: Ну вот из даташит: в режиме побайтного доступа вывод dq15/a1 используется в качестве младшего бита при адресации. Таким образом будет уже 2^26 степени. А в режиме чтения вордами, как вы и говорили, видимо, доступ будет по чётным адресам. |
| Talking_Sword:
--- Цитата: Марат от 17 Июнь 2023, 07:13:37 ---А можно и по одному байту читать/записывать. --- Конец цитаты --- Это если свой код писать наверно нужно учитывать. А мне нужно просто адрес из файла превратить в комбинацию бит, которые можно будет выставить на шине адреса ПЗУ. --- Цитата: Марат от 17 Июнь 2023, 07:13:37 ---А если адресов не хватает, видимо, есть какой то маппер, который переключает банки. --- Конец цитаты --- Мимо! У большинства картриджей нет ничего кроме ПЗУ. Там наоборот нужна дополнительная логика, чтобы подключить 8-битное ПЗУ. Есть у меня один странноватый картридж для Mega Drive с 8-битным ПЗУ, там еще стоит 74LS374, похоже при помощи него как-то "адаптируют" 8-битную шину к 16-битной, но я не разбирался, как это работает. --- Цитата: Марат от 17 Июнь 2023, 07:13:37 ---Ну вот из даташит: в режиме побайтного доступа вывод dq15/a1 используется в качестве младшего бита при адресации. Таким образом будет уже 2^26 степени. А в режиме чтения вордами, как вы и говорили, видимо, доступ будет по чётным адресам. --- Конец цитаты --- Про вывод /BYTE вообще не в тему, он на картриджах для Mega Drive вообще не используется и подтянут к лог. "1". |
| Марат:
Про мегадрайв в вашем сообщении нет упоминания |
| Turbo2000:
А что за регистр такой VDP_PSG? 0x00C00011 Нигде не могу найти упоминания |
| Sharpnull:
Turbo2000, регистр 0xC00011 для 68K для работы с SN76489: https://www.smspower.org/Development/SN76489. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |