Автор Тема: Программа для "распутывания" перепутанных бит  (Прочитано 480 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 899
  • Happy Games Only!
    • Просмотр профиля
Существует ли программа, которая могла бы привести в нормальный вид дамп ПЗУ, у которого биты на шине данных были подключены неправильно?

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4998
    • Просмотр профиля
Есть какой-то алгоритм, как таблица перестановки битов, или должно быть магическим способом?

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 899
  • Happy Games Only!
    • Просмотр профиля
Sharpnull, нужна такая программа, в которой можно бы было вручную задать соответствие битов данных. То есть, например:

D15=D11
D14=D3
D13=D10
D12=D2

И т.д. На самом деле, там все биты перепутаны, кроме одного.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4998
    • Просмотр профиля
Под алгоритмом имел в виду более подробное описание действий. Как понял, обработка по 2 байта из файла и порядок байтов Big-Endian. Вот скрипт на Python 3, кидать файл на него (1-й аргумент), в скрипте задайте порядок байтов: BIG_ENDIAN = True - это BE, поставить False для Little-Endian, перестановку битов: список TABLE состоит из чисел от 0 до 15, это число - индекс бита из входного числа, а индекс самого списка указывает на индекс бита куда будет на выходе, т. е. для D15=D11 (D11 из входного в D15 выходного):
Справа после # комментарий для удобства, указывает на выходной бит.

Оффлайн Talking_Sword

  • Пользователь
  • Сообщений: 899
  • Happy Games Only!
    • Просмотр профиля
Под алгоритмом имел в виду более подробное описание действий.
Забыл написать, что шина 16-битная. На счет подробного описания действий - пользователь может сам задать соответствие бит, то есть такой-то бит=другой бит. Должна быть возможность менять все 16 бит. Так как шина, как уже говорилось, 16-битная, придется менять биты из соседних байт, так как программы на компьютере оперируют 8-битными байтами.

Тот код, что вы выложили, похоже то что надо. Спасибо. Но еще не попробовал.
в скрипте задайте порядок байтов: BIG_ENDIAN = True - это BE, поставить False для Little-Endian
Какой порядок нужен для ROM-ов Sega Mega Drive?

Оффлайн supremacy

  • Пользователь
  • Сообщений: 2255
  • Пол: Мужской
    • Просмотр профиля
Я писал себе программку на c++, которая меняла биты, правда для 8 битного бинарника, могу исходник поискать. Но я порядок прям в коде задавал.
Вроде попадалась такая тулза, возможно на romhacking даже. Сейчас поискал, но нашёл только ту, где смену бит под 27c801 можно сделать.


Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4998
    • Просмотр профиля
Какой порядок нужен для ROM-ов Sega Mega Drive?
У MD Big-Endian, но ромы при записи и дампе могут с другим порядком байтов, это уже вы смотрите. Вы можете сделать перестановку при любом варианте, вам нужно знать как в файле у вас идут байты и их биты и что нужно получить. У меня при BE: в HEX-редакторе 01 04, значит биты от старшего (15) до младшего (0) идут слева направо как есть - 0000 0001 0000 0100, а если у меня сделать LE - будут сначала биты от 7 до 0 (bin 0000 0001), потом от 15 до 8 (bin 0000 01000). Так что наверно BE удобнее будет.