Разработка и ромхакинг > Ромхакинг
Вопросы новичков
<< < (8/22) > >>
Turbo2000:
Спасибо всем больше!
Еще очень помогли разобраться эти примеры, я как наивный думал, что можно менять видео память просто по адресу.  o_0

https://github.com/BigEvilCorporation/megadrive_samples

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

--- Цитата: Марат от 20 Март 2023, 22:34:54 ---А что не так? Он ожидает пока что-то извне изменит память по адресу ffe006.
Это может быть одно из прерываний процессора: строчное, кадровое, переферийное(джойстик).

--- Конец цитаты ---
Разобрался полностью, там действительно кадровое прерывание, там переменная в RAM, похожая на счетчик кадров.
Turbo2000:
Привет, можете подсказать, как находить, когда отправляются таблицы тайлов в VDP_DATA?
Смотрел на примере заставки Sega в Дюне, с помощью дебаггера, запись в VDP_DATA идет всего пару раз, и не понятно, что там в DMA, длина данных 0x800, вроде похоже на правду, но диапазон адресов откуда писать странные 7F8000 - FF0000 (Ram).
Направьте так сказать, куда смотреть, вроде перечила мат. часть, но что-то не сходится.  :neznayu:
FireFox Фан:
Доброго времени суток!

Сложно ли перевести "LEGO Harry Potter: Years 1-4" для NDS?
Марат:

--- Цитата: Turbo2000 от 29 Март 2023, 13:19:00 ---Привет, можете подсказать, как находить, когда отправляются таблицы тайлов в VDP_DATA?
Смотрел на примере заставки Sega в Дюне, с помощью дебаггера, запись в VDP_DATA идет всего пару раз, и не понятно, что там в DMA, длина данных 0x800, вроде похоже на правду, но диапазон адресов откуда писать странные 7F8000 - FF0000 (Ram).
Направьте так сказать, куда смотреть, вроде перечила мат. часть, но что-то не сходится.  :neznayu:

--- Конец цитаты ---

Ну как бы вот написано DMA_SRC = 0x4A320 , DMA_LEN = 0x2C80, VDP_DST = 0x4000



Добавлено позже:
Это в IDA показывает так.
Turbo2000:

--- Цитата: Марат от 29 Март 2023, 21:55:58 ---Ну как бы вот написано DMA_SRC = 0x4A320 , DMA_LEN = 0x2C80, VDP_DST = 0x4000



Добавлено позже:
Это в IDA показывает так.

--- Конец цитаты ---

Мерси,
еще немного покопал, https://segaretro.org/Sega_Mega_Drive/VDP_registers#10
Здесь нашел много полезной, хотя и сжатой информации.
Спасибо за наводку, буду разбираться дальше, постараюсь ограничиться предыдущими глупыми вопросами.
Беларус:
Turbo2000, а ты читал первые посты этой темы? Если нет, то тоже могут помочь :)
(и тогда тема зациклится)
Turbo2000:

--- Цитата: perfect_genius от 31 Март 2023, 15:58:41 ---Turbo2000, а ты читал первые посты этой темы? Если нет, то тоже могут помочь :)
(и тогда тема зациклится)

--- Конец цитаты ---
Я попробую :)
На самом деле вы мне очень помогли, уже все получилось, немного направили + очень много разных источников в интернете, и отличный лоадер + инструменты от МефистО.
Удалось написать распаковщик, найти нужные адреса для графики, наборов тайлов и палитр.
Теперь интересно разобраться в синтезаторе, но думаю, это надолго.

Добавлено позже:
Перечитал, смешно, да  :lol:

Сейчас вопросов по графике, тайлам и палитрам нет.
У меня спортивный интерес использовать ресурсы игры в собственной реализации игры на другом движке, в общем, что-то похожее на демку сделать.

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

--- Цитата: Марат от 29 Март 2023, 21:55:58 ---Ну как бы вот написано DMA_SRC = 0x4A320 , DMA_LEN = 0x2C80, VDP_DST = 0x4000



Добавлено позже:
Это в IDA показывает так.

--- Конец цитаты ---

Ида все правильно показывала, я до этого не знал, что длина данных для DMA вычисляется по два байта, после этого все встало на свои места.
Просто был удивлен, как это так, что один раз пишется 0x800 байт в plane 128x32 и записывается полностью, оказывается дело в том, что это для двух байт.
Zzmey:
Помогите плиз, думал сам справлюсь, но нет.

изучаю статьи по написанию игр для nes на Си
https://habr.com/ru/post/348022/

автор пишет:
"Надо помнить об ограничениях. Поддерживается не больше 64 спрайтов, и не более 8 на одной строке экрана. При превышении лимита будут отрисованы только спрайты с большим приоритетом. Если менять приоритет спрайта между кадрами, он будет мигать. Этот способ часто используется в играх."

и еще:
Почти все персонажи игр состоят из спрайтов. Хотя в некоторых случаях нужно отрисовывать их фоновыми тайлами из-за ограничений на количество спрайтов, такое используется для финальных боссов в некоторых играх.

в общем, мне не хватает количества 64 спрайтов, мне надо больше.
пробовал 1 способ - моргающий, не совсем разобрался в том что такое атрибут приоритета, просто менял атрибуты как попало, и спрайты при этом моргают, но моргают по уродски, как то некрасиво.

пробовал 2 способ, при дорисовке тайлов весь экран дрыгается, проскакивают какие то левые артефакты.

Помогите, как сделать плавную графику тайлами, или хотя бы как увеличить количество спрайтов сменой атрибутов, но чтобы моргание было красивым. И объясните, плиз, что такое приоритет спрайта, какой спрайт будет приоритетным?

Прилагаю тренировочный проект. Там по нажатии кнопки Б видно как дергаются тайлы, а при нажатии кнопки А реализовано моргание спрайтов, но уж больно коряво.

Cyneprepou4uk:
Zzmey, можно перевести спрайты в режим 8x16, тогда в теории получится вывести вдвое больше спрайтов на экране. Режим контролируется регистром 2000. Демонстрацию режима смотри в Tutorial 9 https://nesrocks.com/blog/nes-graphics/

Насчет приоритета спрайтов. Допустим у тебя для спрайтов выделена область 0200-02FF в RAM. Данные спрайта с наивысшим приоритетом находятся в 0200-0203, а с самым низким приоритетом в 02FC-02FF.
Zzmey:

--- Цитата: Cyneprepou4uk от 04 Апрель 2023, 12:09:06 ---контролируется регистром 2000
--- Конец цитаты ---

что это за команда должна быть, для включения режима? хотя бы в принципе?

Вот это вот нашел в вики:

7  bit  0
---- ----
VPHB SINN
|||| ||||
|||| ||++- Base nametable address
|||| ||    (0 = $2000; 1 = $2400; 2 = $2800; 3 = $2C00)
|||| |+--- VRAM address increment per CPU read/write of PPUDATA
|||| |     (0: add 1, going across; 1: add 32, going down)
|||| +---- Sprite pattern table address for 8x8 sprites
||||       (0: $0000; 1: $1000; ignored in 8x16 mode)
|||+------ Background pattern table address (0: $0000; 1: $1000)
||+------- Sprite size (0: 8x8 pixels; 1: 8x16 pixels – see PPU OAM#Byte 1)
|+-------- PPU master/slave select
|          (0: read backdrop from EXT pins; 1: output color on EXT pins)
+--------- Generate an NMI at the start of the
           vertical blanking interval (0: off; 1: on)

значит это пятый бит

у меня в программке было прописано
#define PPU_CTRL      *((unsigned char*)0x2000)

и далее

PPU_CTRL = 0x90
если перевести 16 в двоичный, это будет
10010000
ага, пятый бит был пустой...

попробуем записать в пятый бит единицу - 10110000
это будет  0xB0

пишу PPU_CTRL = 0xB0,
запускаю, ничего не работает, порядок спрайтов не меняется с виду.
пробую b4, ff, без изменений.

где же я ошибаюсь? как же это включить?
Cyneprepou4uk:
Zzmey, все верно, 90 -> B0. Но у тебя там несколько записей в этот регистр. Как минимум самая последняя из них, которая выполняется ежекадрово, должна включать этот режим.
Zzmey:
Подскажите, плиз, как избежать моргания при перерисовке тайлов?

Прилагается пример, проект на С, там при нажатии А или Б тайлы моргают.
Перебрал все варианты, которые в голову пришли, менял PPUMASK и PPUCTRL, переставлял местами, запускал и в цикле и без цикла, не помогает.
Марат:
Надо выключать экран при перерисовке
При нажатии клавиш, у вас вызываются функции top и top2, в этих функциях у вас почему-то закомментированы функции All_Off, All_On. Надо их раскомментировать.

--- Код: ---void top (void){
//All_Off(); // turn off screen
//Load_Palette();
summ_tile();
//All_On(); // turn on screen
}


void top2 (void){
//All_Off(); // turn off screen
//Load_Palette();
summ_tile2();
//All_On(); // turn on screen
}

--- Конец кода ---
Zzmey:
дрыганье устранено, на дрыганье влияло два фактора

1) цикл присваивания PPU_DATA
2) отсутствие Reset_Scroll

по первой проблеме - убедился что одинокая переменная выводится без дрыгания, а цикл выводится с дрыганьем, взял и тупо вывел все переменные без цикла.
по второй проблеме - включаю Reset_Scroll - не дрыгается, выключаю - снова дрыгается.


Еще другие аспекты:

- обязательно нужен вот этот счетчик, его положение в процедуре менял произвольно, положение не влияет ни на что, похоже.
   while (NMI_flag == 0); // wait till NMI
      NMI_flag = 0;

- к удивлению, оказывается не стало нужно включать и выключать экран.

- еще автор писал по поводу моргания вот что:
В идеале, надо ждать V-blank перед вызовом All_On(), иначе один кадр после него будет искажен, и экран будет мерцать.
я даже нашел пример такого кода
   Wait_Vblank();   // don't turn on screen until in v-blank
   All_On();
но он почему-то не понадобился.

прилагется код без дрыганий.
FireFox Фан:
Nik Pi, не могу открыть "Battle City" для NGB. Точнее YY-CHR игру открыл, но в отличии от NES версии не могу сложить картину и вижу только кашу.
Nik Pi:

--- Цитата: FireFox Фан от 28 Апрель 2023, 11:44:57 ---Nik Pi, не могу открыть "Battle City" для NGB. Точнее YY-CHR игру открыл, но в отличии от NES версии не могу сложить картину и вижу только кашу.

--- Конец цитаты ---
Ты уверен что выбрал правильные параметры? Попробуй через TileLayerPro или FaTILEty, там есть специальный параметр для открытия GB игр.
С YY-CHR не знаком  :lol:
Можешь кинуть скрин того что у тебя?
881x113:
Texmod

Указываю путь к .ехе файлу , указываю путь к файлу мода .tpf, если после этого нажать Run, то игра запустится и будет нормально работать с этим модом, но я не хочу перед каждым запуском игры делать все эти манипуляции, а если просто запустить игру, то запускается без мода, как сделать чтобы настройки сохранились и игра всегда запускалась с модом?
Talking_Sword:
Хочу заменить игры на пиратской многоигровке. Но пока нет программатора, чтобы снять дамп с нее, поэтому решил потренироваться на "готовом" ROM-е. Взял Sega Radica! Volume 1, так как там схема переключения почти та же самая, что и в моей многоигровке. Для проверки "вытащил" все игры из ROM-а, заработали все, кроме первой - Kid Chameleon. Стало интересно, почему. Сравнил с хорошим дампом этой игры - не совпадают буквально 3 байта:



Для чего нужны эти изменения?
Sharpnull:

--- Цитата: Talking_Sword от 15 Май 2023, 12:24:38 ---Для чего нужны эти изменения?
--- Конец цитаты ---
Это адрес начала кода, он указывает на меню, очевидно.
UPD: Вот в коде эмулятора об этом: https://github.com/ekeeke/Genesis-Plus-GX/blob/f0c8f839268ba2806fca47187555f084c1a04ad9/core/cart_hw/md_cart.c#L1905. Эмулятор определяет маппер по указанной и реальной контрольной сумме из заголовка рома https://github.com/ekeeke/Genesis-Plus-GX/blob/f0c8f839268ba2806fca47187555f084c1a04ad9/core/cart_hw/md_cart.c#L120, так что, если будете проверять вставку через Genesis Plus GX, нужно либо специально подбирать контр. сумму рома или изменить код эмулятора.
UPD2: Подобрать контр. сумму просто, это сумма всех чисел, представляя ром как массив 2 байтных Big-Endian беззнаковых, кроме заголовка, поэтому нужно в самом конце рома добавить число до суммы 0xFC84.
Talking_Sword:
Sharpnull, на Sega Radica меню в отдельном банке. Вот на этой картинке указано расположение всех игр:



По идее, код меню "лежит" в отдельном банке и никак не "пересекается" с кодом остальных игр. По идее, изменение адреса нужно, только если меню "вшито" в одну из игр, как это описано здесь. Или я чего-то не понимаю?
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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