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