Разработка и ромхакинг > Ромхакинг
[SMD] Палитра в Genesis
(1/2) > >>
bqio:
Здравствуйте! Назрел вопрос по поводу палитры на SMD/Genesis.

Прочитав в интернете информацию выяснил следующее:
- Формат палитры 9bit RGB;
- Палитра хранится в CRAM VDP;
- Цвет в палитре имеет формат: uint16 0000BBB0GGG0RRR0;

Запустил Gens Tracer, открыл ROM, нажал `.`, сдампил CRAM, RAM, SRAM, VRAM, VSRAM.

Открываю CRAM в хексе, вижу следующее:



Начинаю разбирать формат, первый цвет чёрный, пропускаем его, а вот второй уже серый, но я не могу понять один момент.

В хексе это 0x0888
В бинаре это 0000 100 0 100 0 100 0

Соответственно получаем:

R: 100 (4)
G: 100 (4)
B: 100 (4)

Проверил палитру в Tile Molester, он показывает на этом цвете 128 128 128. Где я что не так понимаю?


Sharpnull:
На 32 (0x20) умножить надо, потому что 3 бита отображают значения от 0 до 255. В эмуляторах могут делать поярче, потому что 7*32=224, а не чистый 255.
SeregaZ:
картинки не показывает :( чтоб тебе икалось за то как ты картинки в текст вставлял...

палитра это 2 байта (это не точно, я давно уже не в теме). типа 0BGR. вот берем и потом превращаем эти по отдельности B, G и R в нормальный RGB:

--- Код: ---    Select inp
      Case 0
        out = 0
      Case 2
        out = 36
      Case 4
        out = 72
      Case 6
        out = 109
      Case 8
        out = 145
      Case $A
        out = 181
      Case $C
        out = 219
      Case $E
        out = 255
    EndSelect
--- Конец кода ---

где взял соответствие цветов - не знаю. кто-то давал... не помню уже. так что точность передачи цвета тоже из разряда: это не точно :)
Sharpnull:

--- Цитата: SeregaZ от 29 Октябрь 2022, 09:20:24 ---где взял соответствие цветов - не знаю
--- Конец цитаты ---
Это обычное линейное отображение с отбрасыванием дробной части: floor(255/7*index), только 181 и 219 не совпадают (182 и 218). Вообще, близкие к реальным значениям нелинейные https://gendev.spritesmind.net/forum/viewtopic.php?t=2188:

--- Код: ---Nonlinear levels derived from hardware measurements :
Normal :   0  52  87 116 144 172 206 255
Shadow :   0  29  52  70  87 101 116 130
HiLite : 130 144 158 172 187 206 228 255
--- Конец кода ---
Там ещё варианты и линейная запись как 0 36 72 108 144 180 216 252/255. Кому как нравится.
В Genesis Plus GX получается вообще 0 34 68 102 136 170 204 238.
bqio:
То есть значения цветов будут разниться в зависимости от окружения (эмулятора)?

В моём случае вообще такая формула выходит:


--- Код: ---r = (i >> 1) & 7;
g = (i >> 5) & 7;
b = (i >> 9) & 7;

--- Конец кода ---

Genesis Save State Viewer вообще 146 показывает...

Беларус учит русский:
Замудрёная палитра Сеги была одной из причин создания темы "Вопросы новичков" :lol:
SPOT:
Sega MegaDrive палитра
Sharpnull:

--- Цитата: SPOT от 29 Октябрь 2022, 18:07:22 ---Sega MegaDrive палитра

--- Конец цитаты ---
У вас там вообще написано, что 12 бит, а не 9 бит.
Посмотрел документацию (https://segaretro.org/Mega_Drive_official_documentation), там нарисовали нелинейный график и долбитесь как хотите:

UPD: Они его похоже от балды нарисовали, по оси X криво, а по Y два первых перехода по 48 пикселей, а остальные по 61/62 :) Пытались видимо показать линейно.

Добавлено позже:

--- Цитата: bqio от 28 Октябрь 2022, 22:48:50 ---Открываю CRAM в хексе, вижу следующее:
--- Конец цитаты ---
Порядок байтов у вас неверный в CRAM (GR 0B, а должно быть 0B GR) и размер должен быть 0x80 (128) байт (не знаю почему у Gens больше, VSRAM впихнуть могли). Это из-за создателя Gens, который для удобства везде менял порядок байтов, теперь эта путаница везде встречается и в некоторых форках Gens могли исправить.
UPD3: Посмотрел CRAM в BizHawk, они там накосячили и выводят белый цвет (0E EE) как 01 FF. Похоже объединили биты и получилось 0000 000B BBGG GRRR.
bqio:

--- Цитата: Sharpnull от 29 Октябрь 2022, 19:58:38 ---Порядок байтов у вас неверный в CRAM (GR 0B, а должно быть 0B GR) и размер должен быть 0x80 (128) байт (не знаю почему у Gens больше, VSRAM впихнуть могли). Это из-за создателя Gens, который для удобства везде менял порядок байтов, теперь эта путаница везде встречается и в некоторых форках Gens могли исправить.
UPD3: Посмотрел CRAM в BizHawk, они там накосячили и выводят белый цвет (0E EE) как 01 FF. Похоже объединили биты и получилось 0000 000B BBGG GRRR.
--- Конец цитаты ---
Так какой лучше эмулятор использовать для корректного дампа CRAM и VRAM?

Regen вроде правильный порядок дампит уже. Размер правда, всё также, 512 байт, вместо 128.
Марат:
Gens by Shell. У него правильная палитра, а ещё он может дампить палитру в формате RGB888.

Добавлено позже:

--- Цитата: bqio от 10 Март 2023, 14:47:30 ---Regen вроде правильный порядок дампит уже. Размер правда, всё также, 512 байт, вместо 128
--- Конец цитаты ---
Потому что размер CRAM 512 байт
bqio:
Как-то так вышло в итоге. Ничего не упустил?

https://gist.github.com/bqio/768a7bb9a805c9c45c614b27aef82cf4
Марат:
У меня вот так

--- Код: ---      rgbBlue:= (Value shr 4) and $F0;
      rgbGreen:= Value and $F0;
      rgbRed:= (Value shl 4) and $F0;

--- Конец кода ---
Никаких лишних констант.

Добавлено позже:
Хотя там должно быть and $E0. Как-то проглядел этот момент.
Sharpnull:

--- Цитата: Марат от 10 Март 2023, 15:52:46 ---Потому что размер CRAM 512 байт
--- Конец цитаты ---
С вами не согласны BizHawk (Genesis Plus GX), MAME, а также руководство (https://segaretro.org/index.php?title=File%3AGenesis_Software_Manual.pdf&page=29): "The CRAM contains 128 bytes".

--- Цитата: bqio от 10 Март 2023, 14:47:30 ---Так какой лучше эмулятор использовать для корректного дампа CRAM и VRAM?
--- Конец цитаты ---
Для CRAM используйте что удобно, просто узнайте правильный порядок и учитывайте это.
UPD:

--- Цитата: Марат от 10 Март 2023, 15:52:46 ---Gens by Shell
--- Конец цитаты ---
Только Gens r57shell mod чудовищно медленный, если открыть HEX-редактор, по крайней мере на Win10 с FX-8300 и Ryzen 5600X, чем выше окно, тем больше просадка, на FX-8300 было меньше 30FPS из 60, на 5600X лучше, но всё равно. Вроде на Win7 было лучше, думаю дело в отрисовки (API и код плохой), например, на HxD плохо меняет размер на 5600X тоже. Его пилить и пилить, переписывать GUI.
bqio:

--- Цитата: Sharpnull от 10 Март 2023, 16:25:26 ---Для CRAM используйте что удобно, просто узнайте правильной порядок и учитывайте это.
--- Конец цитаты ---

Как я понял правильный, это LittleEndian?  :)
Sharpnull:

--- Цитата: bqio от 10 Март 2023, 16:41:26 ---Как я понял правильный, это LittleEndian?  :)
--- Конец цитаты ---
Тот который в байтах "0B GR", т. е. для белого "0E EE". Тут обычный Big-Endian, так будет записано в самом роме. Я имел в виду узнать какой порядок в нужном эмуляторе, например по игре, или будет видно по формату по чётным позициям в CRAM: "0x xx" - правильно, "xx 0x" - обратный, или как BizHawk - особый, потом конвертируйте туда-сюда.
bqio:

--- Цитата: Sharpnull от 10 Март 2023, 16:57:39 ---Тот который в байтах "0B GR", т. е. для белого "0E EE". Тут обычный Big-Endian, так будет записано в самом роме. Я имел в виду узнать какой порядок в нужном эмуляторе, например по игре, или будет видно по формату по чётным позициям в CRAM: "0x xx" - правильно, "xx 0x" - обратный, или как BizHawk - особый, потом конвертируйте туда-сюда.
--- Конец цитаты ---
Ну моя конечная цель стоит в ручной распаковке некоторых изображений из VRAM, приведением их в RGB формат "скрестив" с палитрой и превращением в 16x16 bmp. Потому что в игре спрайты персонажей чанками поделены на 8x8.  ^_^
Sharpnull:

--- Цитата: bqio от 10 Март 2023, 17:04:09 ---моя конечная цель
--- Конец цитаты ---
Это легко и полностью делается на Python + PIL (Pillow). Палитру можно читать из рома. Для VRAM не знаю какой порядок, но там тоже не сложно.
bqio:

--- Цитата: Sharpnull от 10 Март 2023, 17:09:30 ---Это легко и полностью делается на Python + PIL (Pillow). Палитру можно читать из рома. Для VRAM не знаю какой порядок, но там тоже не сложно.
--- Конец цитаты ---

Оффсет палитры внутри рома не подскажите? Или он индивидуален у каждой игры?
Sharpnull:

--- Цитата: bqio от 10 Март 2023, 17:10:59 ---Или он индивидуален у каждой игры?
--- Конец цитаты ---
Конечно, и может генерироваться, а не лежать как есть. Так что этот совет только для некоторых случаев.
На счёт кода на Python, вашу convert_color() можно заменить на (на любом другом языке также):

--- Код: ---convert_color = lambda x: (0,49,87,119,146,174,206,255)[x>>1]
--- Конец кода ---
Марат:

--- Цитата: Sharpnull от 10 Март 2023, 16:25:26 ---Только Gens r57shell mod чудовищно медленный, если открыть HEX-редактор, по крайней мере на Win10 с FX-8300 и Ryzen 5600X, чем выше окно, тем больше просадка, на FX-8300 было меньше 30FPS из 60, на 5600X лучше, но всё равно. Вроде на Win7 было лучше, думаю дело в отрисовки (API и код плохой), например, на HxD плохо меняет размер на 5600X тоже. Его пилить и пилить, переписывать GUI.
--- Конец цитаты ---
Для дампы палитра не особо важно. Палитру в формат RGB888 он правильно дампит.
Навигация
Главная страница сообщений
Следующая страница

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