Разработка и ромхакинг > Ромхакинг
Вопросы новичков
<< < (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.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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