Разработка и ромхакинг > Ромхакинг
[SMD] Палитра в Genesis
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 он правильно дампит.
Навигация
Перейти к полной версии