Автор Тема: Sega MD VDP: Что оно такое и с чем его едят  (Прочитано 12048 раз)

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

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #30 : 06 Июль 2011, 17:49:58 »
Кто-нить знает сколько команд может обработать м68к пока идёт отрисовка строки и сколько до начала отрисовки следующей?

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #31 : 07 Июль 2011, 03:45:37 »
Вообщем опытным путем выяснил, что глючит если адрес переходит скажем с $0BFF00 на $0C0000. В этом случае перенесутся нормально только $100байт, а дальше артефакты.  Можно ли это пофиксить?  Пока что тачки раскидал так, чтобы не попадали на такие переходы.
Кега походу правильно себя ведет.
На DMA-перенос из РОМа вообще много ограничений. Например, последняя операция должна обязательно адресоваться из RAM. Совсем недавно я услышал про еще одно шокирующее ограничение - переносимые данные должны быть в переделах банка памяти в $20000 байт. При нарушении границы переносятся не те данные, это эмулируется в Кеге.

Кто-нить знает сколько команд может обработать м68к пока идёт отрисовка строки и сколько до начала отрисовки следующей?
Примерно 36 циклов процессора. Нельзя измерить это в командах, так как на выполнение команд уходит разное кол-во циклов процессора. К примеру, moveq занимает 4 цикла, а mulu в районе 40 (если не больше, точно не помню).

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #32 : 07 Июль 2011, 12:33:40 »
круто. пасиб дружищ  :)

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #33 : 11 Июль 2011, 13:42:05 »
а отрисовка след строки начинается сразу после предыдущей или есть определённое время, через которое это происходит?

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #34 : 11 Июль 2011, 20:05:06 »
а отрисовка след строки начинается сразу после предыдущей или есть определённое время, через которое это происходит?
Конечно не сразу. С определенного момента начинается строчной обратный ход (H retrace), во время которого VDP не занят отображением графики. Имеено в этот период и случается горизонтальное (строчное) прерывание, именно этот период длится около 36 циклов процессора. Кстати, я сначала подумал что в своем прошлом вопросе ты именно его имел ввиду.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #35 : 12 Июль 2011, 10:03:08 »
спасибо ещё раз

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #36 : 25 Июль 2011, 22:48:53 »
Например, последняя операция должна обязательно адресоваться из RAM.
Не знаю, у меня в последних версиях RRR-TE было из ром и говорят всё работало на железе.

Мануал говорит про это:
Цитата
В случае пересылки из ROM в VRAM, может произойти ошибка аппаратуры DMA если присутствуют два состояния:
-- Результирующий адрес (через $C00004) должен быть в режиме записи слова.
-- Финальная запись режима должна использовать рабочую RAM.
  Можно достичь этого либо копированием программы управления DMA в RAM или используя последнюю запись режима DMA используя "move.w ram address $C00004" для пересылки из памяти в VRAM.
Только написано неясно:
1. 'может'  (может произойти а может и нет?/ не на всех приставках)
2. оба состояния.  (одновременно или любое из?)
3. явно перепутано(написано как избежать ошибки, а говорится о том что она произойдет от этого).

Цитата
• Как показала практика, иногда программа инициализации DMA работает и в ПЗУ. Видимо дело в выравнивании команд
  процессора М68000 по четным и кратным адресам. Это связано с тем, что из-за особенностей схемы приставки
  М68000 может читать из ПЗУ только словами (WORD).



Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #37 : 26 Июль 2011, 02:03:14 »
Не знаю, у меня в последних версиях RRR-TE было из ром и говорят всё работало на железе.
Не знаю, верно ли ты меня понял.
Я имел ввиду самую последнюю операцию в настройке DMA, задание адреса VRAM, после чего M68K останавливается, и начинается перенос. Значение в VDP Control Port ($C00004) обязательно должно посылаться из RAM.

По поводу цитатки, она переведена достачно криво. Я довольно часто предпочитаю русской версии оригинал, там многие вещи на мой взгляд расписаны понятнее, хотя комментарии HardwareMan'а в мануале бесценны.

Постараюсь немного уточнить перевод:

Цитата
При DMA-пересылке из ROM в VRAM, может произойти ошибка из-за специфики железа, если не выполняются эти два условия:
- Адрес назначения (оффсет VRAM) должен записываться в VDP Control Port ($C00004) в виде двух слов (две инструкции move.w, так как нужно переслать long word)
- Последняя запись в VDP Control Port (запись адреса назначения, после чего и начинается перенос) обязательно должна адресоваться из RAM.
Этого можно добиться (1) копированием кода DMA-переноса в RAM или (2) посылкой значения из RAM - move.w <адрес RAM>,($C00004).l

Согласно формулировке из официальной документации, условия должны выполняться ОБА. Как я заметил, некоторые разработчики игр действительно трепетно относятся к выполнению этих условий. Я довольно плохо разбираюсь в устройстве самого железа, лишь знаю, как с ним работать, благодаря документациям, так что не представляю, какими особенностями вызваны эти ограничения. Может быть, чем-то можно пренебречь и все будет работать. Насколько знаю, не все игры точно следуют всем канонам документации.

Кстати, только что вспомнил. В своем проекте, Sonic 3 in 1, я не учел все оговоренные условия в коде переноса данных из РОМа, а именно, писал в Control Port сразу long word'ом, правда из памяти.

Выглядело все примерно так:
move.l <оффсет VRAM>,-(sp)
move.l (sp)+,($C00004).l

Работало на реальном железе.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #38 : 26 Июль 2011, 09:19:15 »
а на гофере дма шрифт жует :D

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #39 : 26 Июль 2011, 15:22:13 »
Я имел ввиду самую последнюю операцию в настройке DMA, задание адреса VRAM, после чего M68K останавливается, и начинается перенос. Значение в VDP Control Port ($C00004) обязательно должно посылаться из RAM.
в rock n' roll racing оригинале самое последнее значение пересылается из регистра, а сама команда пересылки находится в рам.

move.l  $A(a0),(a1)
 move.w  $E(a0),d0
 jsr       $38E6(a4)     ;      (FFB8E6)
loc_0_C48:
 moveq   #2,d0
 and.w   (a1),d0
 bne.s   loc_0_C48

V

...FFB8E6..

move.w d0,(a1)
rts


Добавлено позже:
А как мне кажется  должно работать и move.l d7,(a0) , то есть условие что содержимое должно находится в ram или в регистре. 
(баг то по логике происходит, потому что если что-то типа move.l #$12345678,(a0) , а команда эта и число 12345678, это находится в ром, и из ром же должна передача пойти,только с другого адреса)

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #40 : 27 Июль 2011, 23:00:32 »
а на гофере дма шрифт жует :D
Ты про Соник 3 в 1? Где именно шрифты жуются?

А как мне кажется  должно работать и move.l d7,(a0) , то есть условие что содержимое должно находится в ram или в регистре. 
(баг то по логике происходит, потому что если что-то типа move.l #$12345678,(a0) , а команда эта и число 12345678, это находится в ром, и из ром же должна передача пойти,только с другого адреса)
Не уверен, что-то мне подсказывает, что если бы можно было адресовать из регистров, они бы обязательно про это упомянули. Но опять же, ничего конкретно сказать не могу, так как не представляю из-за чего такие ограничения берутся. Хотя можно будет попробовать, а так же ради интереса посмотреть, что будет, если нарушить все условия.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #41 : 28 Июль 2011, 09:54:06 »
Ты про Соник 3 в 1? Где именно шрифты жуются?
в твоей заставке с авторами сборника

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #42 : 08 Август 2011, 23:36:34 »
а на гофере дма шрифт жует :D
а дюна на гофере нормально работает?
там сделали проверку если на переходах с 4F000 на 51000 и т.п. данные  оказываются , то переносятся 2-умя кусками через dma.  <_<

Оффлайн Nemesis_c

  • Пользователь
  • Сообщений: 1341
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #43 : 09 Август 2011, 00:08:46 »
нормально, только со звуком проблемы.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #44 : 09 Август 2011, 09:32:53 »
нормально, только со звуком проблемы.
я играл, все чудесно. звук в меру жеванный.
большой разницы от оригинала нет.
имхо, играется чюдесно ^_^

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #45 : 29 Ноябрь 2011, 18:21:02 »
до меня доперло, чем основано неперекрашивание нескольких пикселей в начале при смене цвета во время отрисовки картинки.
мне кажется всему виной обработка процедур в момент возникновения прерывания.
дело в том что каждая команда занимает определенное колличество циклов. а так, как прерывание происходит во время исполнения какой либо команды, проц сначала доделывает операцию, а потом только сбрасывается на прерывание, что занимает некоторое время и является причиной недоперекрашивания.
все гениальное просто :D
и тут уж никуда не деться

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #46 : 30 Ноябрь 2011, 14:40:18 »
до меня доперло, чем основано неперекрашивание нескольких пикселей в начале при смене цвета во время отрисовки картинки.
мне кажется всему виной обработка процедур в момент возникновения прерывания.
дело в том что каждая команда занимает определенное колличество циклов. а так, как прерывание происходит во время исполнения какой либо команды, проц сначала доделывает операцию, а потом только сбрасывается на прерывание, что занимает некоторое время и является причиной недоперекрашивания.
все гениальное просто :D
и тут уж никуда не деться

HBlank, согласно внутренним счетчикам VDP, занимает столько времени, сколько нужно на отрисовку 2 пикслелей на экране. Согласно документации, это эквивалентно 36 циклам M68K. (Я это называю по памяти, так что могу немного наврать в цифрах).

Насчет "процессор сначала заканчивает обработку инструкции, а потом переключается на прерывание" - я тоже так думаю, хотя это только моя догадка, так как я не сильно разбираюсь в механизме обработки прерывания. Если оно так, действительно пара циклов может теряться. Однако крайне мало инструкций процессора занимают больше 10 циклов, и думаю, большая редкость застать длинную инструкцию в самом начале ее выполнения.

В то же время, обработка самого прерывания тоже должна занять пару циклов процессора. Нужно сохранить в стеке значение PC (Program Counter - оффсет текущей инструкции), на котором произошло прерывание, а также значение SR (Status Register). Кстати, именно из-за того, что в стеке настраивается состояние SR, для возврата из прерывания нужна специальная инструкция RTE, а не обычный RTS.

Но вряд ли может случиться так, что все эти операции по времени займут больше, чем само прерывание. Вот тот эффект про который ты говоришь, ты заметил в Канслвании. Но видел ли ты его когда-нибудь в Сониках? Я не видел, если только мельком в Соник 3 (в AIZ 2).
Где-то на первой странице этого топика я высказывал мысль, что дело в медленном коде. Думаю, так и есть. Код прерывания не оптимален, понатыкан всякими бранчами, отнимающими время процессора, а может сам перенос цветов в CRAM сделан медленно (например, если перебрасывать по 2 байта, да еще и в цикле, потери времени будут огромны). Ну а если код еще написан на Си...
Вобщем, из-за всего этого палитра не успевает переброситься вовремя, и уже начинается отображение новой строки с еще старой палитрой.
« Последнее редактирование: 30 Ноябрь 2011, 14:42:22 от vladikcomper »

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #47 : 30 Ноябрь 2011, 19:09:36 »
в сонике 3 просто спрайты с волнами на воде.
изза них ничего и не видно.
поправь меня если не прав.

 воще чтоб моск не парить не легче ли замутить DME переброс палитры?
так и быстрее. вдруг успеет? ^_^

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #48 : 30 Ноябрь 2011, 22:36:33 »
в сонике 3 просто спрайты с волнами на воде.
изза них ничего и не видно.
поправь меня если не прав.
Спрайты в виде волн в Гидросити. И причем здесь мерцание пикселей? Мерцают спрайты.
Зато посмотри как интересно проходит линия воды в Angel Island Zone:

Я про этот уровень как раз и говорил. Здесь палитра меняется выборчно и в течении нескольких строк. Создается такой приятный эффект объемности. И только здесь, в AIZ2, в некоторых местах можно увидеть мерцающие пиксели, но они проходят через всю линию.

Цитата
воще чтоб моск не парить не легче ли замутить DME переброс палитры?
так и быстрее. вдруг успеет?
Тоже задумывался, почему в Сониках перенос палитры во время прерывания не через DMA (насчет других игр не знаю). Думаю, дожна быть причина, Юджи Нака же крайне умный и умелый программист. Хотя, надо будет как-нибудь на досуге попробовать, заодно и проверить, как оно ведет себя на реальном железе.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #49 : 01 Декабрь 2011, 15:11:08 »
Тоже задумывался, почему в Сониках перенос палитры во время прерывания не через DMA (насчет других игр не знаю).
Если малое количество данных нужно отослать, без дма быстрее. На само его включение больше уйдет времени, это раз. Второе - во время отображения скорость одинаковая.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #50 : 01 Декабрь 2011, 18:53:12 »
нуда. так можно отправить сначал одну палитру, потом другую.
а период между ними поставить воще не вопрос :)
кстати в комикс зон творят с этим чюдеса.
взять последнюю 5 и 6 страницы. вода там очень хитрая.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #51 : 15 Декабрь 2011, 10:40:21 »
вопрос знающим людям.
ситуация такая. пишу свою игру на сега.
написал свой движ отображения спрайтов и столкнулся с такой проблемой.
не могу согласовать приоритеты между спрайтами. почему то 0й показывает последним.
и еще не много не впетрю, как приоритет контролируется между слоями,
если он в спрайте имеет всего один бит.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #52 : 15 Декабрь 2011, 13:11:35 »
почему то 0й показывает последним.
Так сделано значит, счет с 1 по 79 , а 80-ый (0-ой) последний.  Смотри debug-vdp sprites.
Приоритет если 1 значит точно всегда сверху спрайт.
Если 0 - то, видимо еще зависит от того какой приоритет в тайлах в фоне.

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #53 : 15 Декабрь 2011, 15:43:47 »
вопрос знающим людям.
ситуация такая. пишу свою игру на сега.
написал свой движ отображения спрайтов и столкнулся с такой проблемой.
не могу согласовать приоритеты между спрайтами. почему то 0й показывает последним.
и еще не много не впетрю, как приоритет контролируется между слоями,
если он в спрайте имеет всего один бит.
С нулевым спрайтом все логично - вначале VPD отображает его, потом он перекрывается следующим по списку тайлом, и так далее, что в итоге оказывается последним.

Флаг приоритета используется, чтобы поместить спрайт поверх всех планов, удобно для того, чтобы сделать HUD, например.

Без флага приоритета спрайт отображается поверх планов А и Б, и его могут перекрыть только тайлы планов А и Б с высоким приритетом. Вот как контроллер приоритетов VDP распределяет слои (приритеты даю по возврастанию):

1) Фоновый цвет
2) План Б с низким приоритетом
3) План А с низким приоритетом
4) Спрайты с низким приоритетом
5) План Б с высоким приоритетом
6) План А с высоким приоритетом
7) Спрайты с высоким приоритетом

Низкий приоритет - это когда у спрайта или тайла на плане бит приоритета равен 0, высокий - 1.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #54 : 15 Декабрь 2011, 18:07:38 »
спасибо большое, проблема разрешилась ^_^

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #55 : 14 Февраль 2012, 14:26:20 »
опять проблема. с горизонтальным прерыванием.
хочу затемнить нижнюю часть экрана, а вместо этого максимум получается мерцание по 2 половинкам экрана.
т.е. сначала сверху светло, снизу темно, а на след кадре уже вверху темно, внизу светло
из 2 часов попыток ничего путного невышло.
узнал только что если записать 8A20 то горизонтальное прерывание будет происходить всегда через каждые 32 строки ($20)
пробовал и это использовать, всеравно ничего не выщло :'(
может я чтото упустил?

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #56 : 14 Февраль 2012, 20:00:17 »
Горизонтальные прерывания - вещь очень прихотливая, тут если не уследить за какой-то малейшей деталью или не учесть мелочь - все пойдет комом.

Цитата
узнал только что если записать 8A20 то горизонтальное прерывание будет происходить всегда через каждые 32 строки ($20)
Все верно, регистр VDP $0A задает интервал в строках, через который нужно совершать горизонтальное прерывание.

В VDP есть внутренний счечик горизонтальных линий, который уменьшается на единицу с каждой отрисованной линией, и когда он достигает нуля, случается горизонтальное прерывание (если включено), а в счетчик загружается значение регистра $0A. Помимо этого, счетчик автоматически обновляется на линии 0 (начало кадра) и на линиях 225-261 (период VBlank'а). Последнее означает, что во время VBlank'а горизонтальные прерывания случатся не должны.

Важно отметить, что счетчик *не* обновляется как только в регистр $0A записывается новое значение. Он обновляется только при вышеописанных условиях. И это логично, иначе счетчик линий потерял бы привязку к началу рисования кадра.

Поскольку кадр состоит из 224 линий, если задать счетчику значение меньшее, чем 112, горизонтальное прерывание случится больше одного раза. Segaman, если у тебя оно случается по нескольку раз за кадр, это может объяснить мерцание, а может, это какой-нибудь баг в коде.

Если ты хочешь сделать прерывание только в одном месте, нужно позаботиться о том, чтобы после первого вызова, код прерывания в пределах одного кадра больше не выполнялся. Для этого можно сделать флаг в памяти и включать его в процедуре прерывания. И выходить из кода прерывания, если флаг включен. Потом, можно сбрасывать флаг в процедуре вертикального прерывания, чтобы к новому кадру он снова был чист. Также в коде горизонтального прерывания можно задавать регистру VDP $0A значение $DF, так, прерывание гарантированно случится не более двух раз (при следующем прерывании в счечик будет загружено значение $DF - 223 линии).

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Sega MD VDP: Что оно такое и с чем его едят
« Ответ #57 : 15 Февраль 2012, 10:03:55 »
Горизонтальные прерывания - вещь очень прихотливая, тут если не уследить за какой-то малейшей деталью или не учесть мелочь - все пойдет комом.
это я уже уяснил. спасибо за хелп.
чтоб я без вас делал ^_^