Спрайты (демка BALLS.EXE)
Moderator: Shaos
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Спрайты (демка BALLS.EXE)
Всем здрасьте. Может кто случаем разбирался в работе видеорежимов Спринтера? я тут кое-чего пишу и наткнулся на одну непонятку.
В мануале от Ивана сказано, что при включении видео страницы от 50h до 5fh, бит 3 указывает на работу с прозрачным цветом (FFh).
Бит 2 для временного вывода спрайта (нет дублирования в озу). Так вот, проблема именно с этим режимом.
Я включил страницу 50h в 3е окно. Вывел фоновую картинку. Включаю страницу 5Ch (т.е. биты 2 и 3 установлены). Далее начинаю вывод серии фаз анимации персонажа через аксель (ld l,l).
И вот тут получается так, что вывожу первый кадр, потом второй. Но при выводе второго кадря первый не затёрт, он виден и получается "мусор". Т.е. получается как задвоение.
Третий кадр - два прошлый кадра тоже на своих местах и так далее все кадры. Как написано в доке, бит 2 для временного вывода. т.е. я предположил, что копировать область
под выводимым спрайтом не требуется. Об этом так же в доке сказано. Но по факту - видимо требуется. или я что-то не так понял или не так делаю?
RGMOD = 0 (т.е. переключение экранов не трогаю вообще).
Может кто подсказать что и как?
В мануале от Ивана сказано, что при включении видео страницы от 50h до 5fh, бит 3 указывает на работу с прозрачным цветом (FFh).
Бит 2 для временного вывода спрайта (нет дублирования в озу). Так вот, проблема именно с этим режимом.
Я включил страницу 50h в 3е окно. Вывел фоновую картинку. Включаю страницу 5Ch (т.е. биты 2 и 3 установлены). Далее начинаю вывод серии фаз анимации персонажа через аксель (ld l,l).
И вот тут получается так, что вывожу первый кадр, потом второй. Но при выводе второго кадря первый не затёрт, он виден и получается "мусор". Т.е. получается как задвоение.
Третий кадр - два прошлый кадра тоже на своих местах и так далее все кадры. Как написано в доке, бит 2 для временного вывода. т.е. я предположил, что копировать область
под выводимым спрайтом не требуется. Об этом так же в доке сказано. Но по факту - видимо требуется. или я что-то не так понял или не так делаю?
RGMOD = 0 (т.е. переключение экранов не трогаю вообще).
Может кто подсказать что и как?
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты
Ну и что? столько времени прошло, все смотрят и никто ничего не запостил. Shaos, ну ты-то наверняка что-то знаешь? кто-то же есть ещё кто может знать особенности работы видеоконтроллера Спринтера?
объясняю суть проблемы: все мы знаем flicplay, утилита для просмотра флик анимации. как происходит вывод на экран там:
при этом, вывод осуществляется всегда в 0й экран (адреса 0го экрана), хотя судя по порту rgmod (c9h) активен именно 1й. обновления самого экрана осуществляется по стандартной sync() вида ei:halt иначе никак. хоть закидайся в экран данные, они не покажутся без этой конструкции. данный метод прекрасно работает тогда, когда нужно обновлять весь экран (точнее, всю картинку, каких бы она размеров не была). а вот на динамичных сценах, типа как в соседней теме про си, там пример с шариками, там возникают разные косяки. например, если использовать алгоритм из плеера, что шарики отрисовываются со шлейфом (следом) т.е. требуется сохранять область под шариками, рисовать шарики, делать синх, потом восстанавливать область. если делать это столько раз, сколько у нас на экране объектов (шариков), то это получается сильно накладно. дешевле делать save/restore всего экрана. в документации сказано, что есть два управляющих бита в номере видеостраницы - бит 2 и бит 3. бит 3 отвечает за прозрачный цвет (ff). с ним проблем нет. а вот как работать со 2м бытом, это вопрос "на мильён".
если оставлять всю логику не изменой, но в странице видеопамяти воткнуть 2й бит, то шарики не появляются вообще! есть фоновая картинка и всё. если сделать вывод шариков сразу в 1й экран, то шарики есть, но при выводе они постоянно моргают. если отбросить вариант логики плеера и не делать копии на 1 экран, а всё выводить на 0й, то работа 2го бита в видеостранице не влияет ни на что. шарики есть и след за ними тоже на месте. просмотрел в дебагере как работают такие демки как fish. там нет использования прозрачности, на экран вывод без акселя, экран всегда 0й. т.е. пример плохой. в 3d_stars там есть переключение экранов, но я что-то не понял, как там оно работает. когда я делаю подобное, то получаю сплошное моргание.
объясняю суть проблемы: все мы знаем flicplay, утилита для просмотра флик анимации. как происходит вывод на экран там:
Code: Select all
; да собственно тут мелкий кусочек
call KADR_PROG ; тут разбор фреймов флик файла и сразу выброс на экран, когда данные кадра закончены
ei ;делаем синхру
halt ; и вот тут картинка сразу появляется.
di
ld bc, 0054h
rst 10h
call CopySCR_1to2 ;перенос содержимого 0го экрана в 1й
ld bc, 0154h
rst 10h
если оставлять всю логику не изменой, но в странице видеопамяти воткнуть 2й бит, то шарики не появляются вообще! есть фоновая картинка и всё. если сделать вывод шариков сразу в 1й экран, то шарики есть, но при выводе они постоянно моргают. если отбросить вариант логики плеера и не делать копии на 1 экран, а всё выводить на 0й, то работа 2го бита в видеостранице не влияет ни на что. шарики есть и след за ними тоже на месте. просмотрел в дебагере как работают такие демки как fish. там нет использования прозрачности, на экран вывод без акселя, экран всегда 0й. т.е. пример плохой. в 3d_stars там есть переключение экранов, но я что-то не понял, как там оно работает. когда я делаю подобное, то получаю сплошное моргание.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты
я согласен с тем, что когда делаешь какие-то системные программки или игры в которых большая часть спрайтов фиксированного размера, всего вроде даже хватает. вот можно глянуть на тот же thunder in the deep. там даже прозрачность не используется. фоновой картинки нет. фон вообще там чёрный. все спрайты карты и сам ГГ одних размеров. тут даже аксель, в целом, не требуется. но когда хочешь сделать какую-то "демку" или игру в которой около десятка подвижных объектов, да ещё и поверх какого-то фона (карты), то всего того, что используется в TITD уже мало. нужна и прозрачность и работа с областями под объектами и прочее.Shaos wrote:Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...
-
- Doomed
- Posts: 413
- Joined: 11 Dec 2003 14:34
Re: Спрайты
Понравится тебе или нет, но у тебя только один путь - познакомиться с AHDL и разобраться в сорцах Спринтера, если уж ты так "подсел" на него. Никто другой тебе не поможет - Спринтер был не настолько распространен, чтобы у него были толпы поклонников (владельцев), отсюда и исходи. Насколько я помню, для Thunder-а Иван писал свою плис-конфу, с гориз. скроллингом экрана и всех железных фитч этой игрушки нет в стандартной (и доступной) плис-конфе. А в наше время (когда существовала еще питерская тим), по каждой мелочи приходилось "тыкаться" к Ивану, потому как в доках было описано далеко не все, а самому разобраться в работе Спринтера - гиблое дело (что я имею ввиду, я раньше писал).Sayman wrote:я согласен с тем, что когда делаешь какие-то системные программки или игры в которых большая часть спрайтов фиксированного размера, всего вроде даже хватает. вот можно глянуть на тот же thunder in the deep. там даже прозрачность не используется. фоновой картинки нет. фон вообще там чёрный. все спрайты карты и сам ГГ одних размеров. тут даже аксель, в целом, не требуется. но когда хочешь сделать какую-то "демку" или игру в которой около десятка подвижных объектов, да ещё и поверх какого-то фона (карты), то всего того, что используется в TITD уже мало. нужна и прозрачность и работа с областями под объектами и прочее.Shaos wrote:Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...
Vasil Ivanov
vasil-i@yandex.ru
vasil-i@yandex.ru
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты
в этой игре нет совсем никаких интересных и особенных фишек. уж не знаю про скролл, но такую игру можно и на стоковой конфе спокойно реализовать. все спрайты одного размера, фон чёрный (восстанавливать нечего, можно просто затирать), уровень статический (без скроллирования туда-сюда). Тем не менее, с работай спрайтов и с временным режимом вывода я разобрался. если кому будет интересно, могу доку подкинуть.с гориз. скроллингом экрана и всех железных фитч этой игрушки нет в стандартной (и доступной) плис-конфе.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Подкидывай - можно прямо текстом в форум - для истории так сказать...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты
ну тогда вот:Shaos wrote:Подкидывай - можно прямо текстом в форум - для истории так сказать...
так же прикрепляю архив с шариками и их исходниками. подробности в balls.txt.В официальной документации есть информация о том, что при работе с графическим
экраном есть несколько методов для вывода графики:
- обычный;
- прозрачный цвет;
- временный;
Режим включается через указание номера страницы в порт окна процессора. Известно,
что для графического экрана у нас доступно 16 страниц с номерами 50h - 5fh.
При этом по факту программист не участвует в переключении этих страниц. Нужно
знать только одно, что в номере страницы биты 2 и 3 отвечают за режим вывода.
3..2 = 0 = 50h обычный метод вывода. Все данные попадают на экран без исключения.
bit3 = 1 = 58h режим прозрачного цвета. Цвет с номером FFh не выводится на экран.
bit2 = 1 = 54h временный вывод на экран. Самый мутный режим и тут нужно немного
пояснить как работает экран у Спринтера.
Для работы с графикой на Спринтере установлена отдельная память - vram,
т.е. видео-озу. По факту это sram, быстрая память. Экран устроен так, что при
обычном методе или с приминением прозрачности все данные записываются и в vram
и в ram (озу). Суть метода 3 в том, что когда он активен данные пишутся
только в vram. Например, мы включили граф.режим, обычный метод и вывели фоновую
картинку на весь экран. Потом включили бит3+бит2 и вывели какой-то спрайт.
Координаты вывода мы запомнили. Потом нам нужно сдвинуть спрайт на сколько-то
пикселей в сторону. Мы берём ранее сохранённые координаты, включаем обычный
режим и делаем чтение и запись в те же координаты. Что получается в результате?
Фоновая картинка была записана и в ram и в vram. Потом по методу 3+прозрачность
мы вывели спрайт. Его данные попали только в vram, а в ram сохранена фоновая
картинка. Когда мы снова включили обычный режим и сделали чтение, мы прочитали
данные из ram, а потом записали их в vram и повторно в ram. Таким образом мы
восстановили область под спрайтом. После этого можно рисовать спрайт в новых
координатах. Замысел данного метода в том, что нам не требуется процедура
и лишний буфер для сохранения фона (данные под спрайтом). Однако процедура
которая будет восстанавливать этот фон, всё же нужна. При использовании
акселератора это работает достаточно быстро. Биты 2 и 3 можно использовать как
раздельно, так и совместно.
Ближайшим примером работы всех этих режимов является демка balls.
You do not have the required permissions to view the files attached to this post.
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Премного благодарен
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Попробовал balls.exe запустить в своём эмуле - выводит непонятности в терминал:
и рисует такое:
Прозрачность я скажем поправлю, а вот зачем порт C9 (RGMOD) трогался? У меня он считается неизвестным, а в ZXMAK2 он вроде вообще никак не используется - просто значение запоминается и потом отдаётся
Code: Select all
Write 0x00 to unknown port 0x00C9
Read from unknown port 0x50C9
Read from unknown port 0x1FC9
Read from unknown port 0x1EC9
Read from unknown port 0x1DC9
Read from unknown port 0x1CC9
Read from unknown port 0x1BC9
Read from unknown port 0x1AC9
Read from unknown port 0x19C9
Read from unknown port 0x18C9
Read from unknown port 0x17C9
Read from unknown port 0x16C9
Read from unknown port 0x15C9
Read from unknown port 0x14C9
Read from unknown port 0x13C9
Read from unknown port 0x12C9
Read from unknown port 0x11C9
Read from unknown port 0x10C9
Read from unknown port 0x0FC9
Read from unknown port 0x0EC9
Read from unknown port 0x0DC9
Read from unknown port 0x0CC9
Read from unknown port 0x0BC9
Read from unknown port 0x0AC9
Read from unknown port 0x09C9
Read from unknown port 0x08C9
Read from unknown port 0x07C9
Read from unknown port 0x06C9
Read from unknown port 0x05C9
Read from unknown port 0x04C9
Read from unknown port 0x03C9
Read from unknown port 0x02C9
Read from unknown port 0x01C9
Read from unknown port 0x00C9
Read from unknown port 0x03C9
Read from unknown port 0x02C9
Read from unknown port 0x01C9
Read from unknown port 0x00C9
...
Прозрачность я скажем поправлю, а вот зачем порт C9 (RGMOD) трогался? У меня он считается неизвестным, а в ZXMAK2 он вроде вообще никак не используется - просто значение запоминается и потом отдаётся
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Вроде сделал поддержку этих двух битов - теперь рисует так:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты
Порт 0xC9 (RGMOD) это переключение активного экрана. грубо говоря (по спектрумовский), переключает 0й и 1й экран, делая один из них видимым, второй теневым.
переключение через 0й бит. если D0 = 0, то активный 0й экран. ну и D0 = 1, значит активный 1й экран.
Если там и есть ещё какие-то значения для других битов, то они мне не известны.
сначала я вывел фоновую картинку. режим экрана был 0x50 (обычный).
рисую шарики как 0x50 or %00001100, с включённой прозрачностью и с режимом temporary (не придумал более другого названия) - данные не попадают в ОЗУ! они пишутся сразу в vram. для того, чтобы переместить шарик (нарисовать на новой координате) мне нужно старый шарик затереть. координаты текущего положения шарика у меня есть. я перечитываю из ОЗУ квадратик фона и перезаписываю его в эти же координаты. бац и шарик стёрт, а фон восстановлен. переходим к следующему объекту.
кстати, в демке немерянно говнокода. кто бы оптимизировал её?
Code: Select all
in a,(rgmod)
and 1
xor 1
out (rgmod),a
Если там и есть ещё какие-то значения для других битов, то они мне не известны.
рисуется так потому, что не полностью реализованы режимы экрана. как я тут шарики рисую:Вроде сделал поддержку этих двух битов - теперь рисует так:
сначала я вывел фоновую картинку. режим экрана был 0x50 (обычный).
рисую шарики как 0x50 or %00001100, с включённой прозрачностью и с режимом temporary (не придумал более другого названия) - данные не попадают в ОЗУ! они пишутся сразу в vram. для того, чтобы переместить шарик (нарисовать на новой координате) мне нужно старый шарик затереть. координаты текущего положения шарика у меня есть. я перечитываю из ОЗУ квадратик фона и перезаписываю его в эти же координаты. бац и шарик стёрт, а фон восстановлен. переходим к следующему объекту.
кстати, в демке немерянно говнокода. кто бы оптимизировал её?
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты
Спасибо - я так и подумал
Есть у меня пара мыслей как в эмуль 2 экрана воткнуть - это не так чтобы очень быстро, но выполнимо - буду отлаживаться на твоих шариках и ротозуме
Есть у меня пара мыслей как в эмуль 2 экрана воткнуть - это не так чтобы очень быстро, но выполнимо - буду отлаживаться на твоих шариках и ротозуме

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Спрайты (демка BALLS.EXE)
На реальном Спринтере оно должно запускаться вот так:

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 223
- Joined: 05 Oct 2009 19:44
- Location: 212.164.105.5
Re: Спрайты (демка BALLS.EXE)
да я просто текстурки обновил. эти поинтереснее выглядят (как мне кажется). в архиве что в телеге выложил всё есть. можно заменить на свои.