Разработка и ромхакинг > Ромхакинг и программирование
Sega MD VDP: Что оно такое и с чем его едят
<< < (2/3) > >>
Ti_:

--- Цитата: Segaman от 30 Апрель 2011, 12:53:49 ---Нифига не 12бит.

--- Конец цитаты ---
ну, 'only internally',  т.е. 'только внутренне ', какая-то желязячка там и 12 могла выдывать, но сделали только 9.
Segaman:

--- Цитата: vladikcomper от 30 Апрель 2011, 16:56:28 ---Нельзя. Нет попиксельных прерываний. Возможны только построчные прерывания (Horizontal Interrupts). Ты можешь изменить палитру и параметры отбражения только для целой следующей строки на экране, но никак не для пикселя.

--- Конец цитаты ---
а если обмануть видюху? Я видел в каслвании воду в каком-то левле, так в ней отражение левела вверх-ногами. Там когда отражение начинается, несколько пикселей недоперекрашиваются и остаются нормальными. Значит такое вполне возможно. Сегодня если будет возможность, попробую разрешить наш спор написанием рома, постоянно делающего замену цвета заднего фона.
vladikcomper:

--- Цитата: Segaman от 30 Апрель 2011, 19:49:02 ---а если обмануть видюху? Я видел в каслвании воду в каком-то левле, так в ней отражение левела вверх-ногами. Там когда отражение начинается, несколько пикселей недоперекрашиваются и остаются нормальными. Значит такое вполне возможно. Сегодня если будет возможность, попробую разрешить наш спор написанием рома, постоянно делающего замену цвета заднего фона.

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

Segaman, у тебя просто грандиозные и невероятные планы =Р Не надо лезть в дебри, лучше просто с вертикальными прерываниями попрактикуйся, чтобы представлять, как все работает и луше понимать, как делаются все вышеописанные трюки.

В "каслванию" не играл, так что в живую это увы не видел. Скорее всего это объясняется тем, что горизонтальное прерывание не успевает завершиться перед началом прорисовки следующей строки, так что часть строки отображается со старой палитрой. Интересно будет на это взглянуть.

Никакого "обмана видюхи" не существует. То, что ты планируешь сделать (если это возможно) будет скорее "грязным" и глючным трюком. Нужно точно рассчитать продолжительность прерывания, чтобы попасть в момент прорисовки новой строки, потом еще угадать время до отбражения следующего пикселя (и не факт что это вообще возможно, может быть тому эффекту в "каслвании" есть другое объяснение).

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

EDIT: GRAMMAR
r57shell:
есть возможность программно узнавать текущий пиксель,который обновляется.
Ti_:

--- Цитата: r57shell от 30 Апрель 2011, 22:05:48 ---есть возможность программно узнавать текущий пиксель,который обновляется.

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

--- Цитата: HoRRoR --- Российские ромхакеры настолько суровы, что рисуют пиксели программно.
--- Конец цитаты ---
  :ohmy:


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

--- Цитата: vladikcomper от 30 Апрель 2011, 21:50:46 ---Segaman, у тебя просто грандиозные и невероятные планы =Р

--- Конец цитаты ---
прям как я, не знал основ и не знал возможно ли и будут идеи работать, но невобразимое много раз получалось)
Segaman:
Написал, проверил. Цвет меняют целые строки. Жаль :,(

То что сдесь было написано я по ошибке не в той теме написал.
Ti_:
А вот тут что-то написано про 512 цветов, но ссылка уже не работает.
http://gendev.spritesmind.net/forum/viewtopic.php?t=44

--- Цитата ---Ok I got it working. It displays ... 256 colors.
--- Конец цитаты ---
GManiac:
5 лет назад я делал демку на 512 цветов, может, даже осталась. Но мне показали на Чарльза МакДональда :), который опередил меня ещё на 5 лет и сделал 1536 цветов.

http://cgfm2.emuviews.com/old2001.php
http://cgfm2.emuviews.com/zip/md1536.zip
http://gendev.spritesmind.net/forum/viewtopic.php?t=435
Segaman:
Вообще когда есть такая возможность - менять палитру на каждой строке, то и картинку можно вывести намного качественней с минимальными потерями. А для видео роликов вообще чюдо. Над будет поразмыслить над этим... XD

Добавлено позже:
А если картинку ещё и двухслойную сделать, то потерь вообше видно не будет.
Ололололо
Ti_:
Странный баг.
В последнем апдейте хака rrr-te , сделал переброс тачек через dma сразу из рома (было из рама).
В одном из кадров взрыва тачек , и спрайта танка, появляется такой артефакт:
Артефакт  GENS не показывает, а KEGA показывает.

Вообщем опытным путем выяснил, что глючит если адрес переходит скажем с $0BFF00 на $0C0000. В этом случае перенесутся нормально только $100байт, а дальше артефакты.  Можно ли это пофиксить?  Пока что тачки раскидал так, чтобы не попадали на такие переходы.
Segaman:
Кто-нить знает сколько команд может обработать м68к пока идёт отрисовка строки и сколько до начала отрисовки следующей?
vladikcomper:

--- Цитата: Ti_ от 17 Май 2011, 21:23:47 ---Вообщем опытным путем выяснил, что глючит если адрес переходит скажем с $0BFF00 на $0C0000. В этом случае перенесутся нормально только $100байт, а дальше артефакты.  Можно ли это пофиксить?  Пока что тачки раскидал так, чтобы не попадали на такие переходы.

--- Конец цитаты ---
Кега походу правильно себя ведет.
На DMA-перенос из РОМа вообще много ограничений. Например, последняя операция должна обязательно адресоваться из RAM. Совсем недавно я услышал про еще одно шокирующее ограничение - переносимые данные должны быть в переделах банка памяти в $20000 байт. При нарушении границы переносятся не те данные, это эмулируется в Кеге.


--- Цитата: Segaman от 06 Июль 2011, 17:49:58 ---Кто-нить знает сколько команд может обработать м68к пока идёт отрисовка строки и сколько до начала отрисовки следующей?

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

--- Цитата: Segaman от 11 Июль 2011, 13:42:05 ---а отрисовка след строки начинается сразу после предыдущей или есть определённое время, через которое это происходит?

--- Конец цитаты ---
Конечно не сразу. С определенного момента начинается строчной обратный ход (H retrace), во время которого VDP не занят отображением графики. Имеено в этот период и случается горизонтальное (строчное) прерывание, именно этот период длится около 36 циклов процессора. Кстати, я сначала подумал что в своем прошлом вопросе ты именно его имел ввиду.
Segaman:
спасибо ещё раз
Ti_:

--- Цитата: vladikcomper от 07 Июль 2011, 03:45:37 ---Например, последняя операция должна обязательно адресоваться из 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:

--- Цитата: Ti_ от 25 Июль 2011, 22:48:53 ---Не знаю, у меня в последних версиях 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:
а на гофере дма шрифт жует :D
Ti_:

--- Цитата: vladikcomper от 26 Июль 2011, 02:03:14 ---Я имел ввиду самую последнюю операцию в настройке 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, это находится в ром, и из ром же должна передача пойти,только с другого адреса)
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

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