nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 15:11



Reply to topic  [ 15 posts ] 
Спрайты (демка BALLS.EXE) 
Author Message
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Всем здрасьте. Может кто случаем разбирался в работе видеорежимов Спринтера? я тут кое-чего пишу и наткнулся на одну непонятку.
В мануале от Ивана сказано, что при включении видео страницы от 50h до 5fh, бит 3 указывает на работу с прозрачным цветом (FFh).
Бит 2 для временного вывода спрайта (нет дублирования в озу). Так вот, проблема именно с этим режимом.
Я включил страницу 50h в 3е окно. Вывел фоновую картинку. Включаю страницу 5Ch (т.е. биты 2 и 3 установлены). Далее начинаю вывод серии фаз анимации персонажа через аксель (ld l,l).
И вот тут получается так, что вывожу первый кадр, потом второй. Но при выводе второго кадря первый не затёрт, он виден и получается "мусор". Т.е. получается как задвоение.
Третий кадр - два прошлый кадра тоже на своих местах и так далее все кадры. Как написано в доке, бит 2 для временного вывода. т.е. я предположил, что копировать область
под выводимым спрайтом не требуется. Об этом так же в доке сказано. Но по факту - видимо требуется. или я что-то не так понял или не так делаю?
RGMOD = 0 (т.е. переключение экранов не трогаю вообще).
Может кто подсказать что и как?


02 Mar 2015 08:42
Profile
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Ну и что? столько времени прошло, все смотрят и никто ничего не запостил. Shaos, ну ты-то наверняка что-то знаешь? кто-то же есть ещё кто может знать особенности работы видеоконтроллера Спринтера?
объясняю суть проблемы: все мы знаем flicplay, утилита для просмотра флик анимации. как происходит вывод на экран там:
Code:
; да собственно тут мелкий кусочек
      call   KADR_PROG        ; тут разбор фреймов флик файла и сразу выброс на экран, когда данные кадра закончены
      ei               ;делаем синхру
      halt               ; и вот тут картинка сразу появляется.
      di   
      ld   bc, 0054h
      rst   10h
      call   CopySCR_1to2   ;перенос содержимого 0го экрана в 1й
      ld   bc, 0154h
      rst   10h

при этом, вывод осуществляется всегда в 0й экран (адреса 0го экрана), хотя судя по порту rgmod (c9h) активен именно 1й. обновления самого экрана осуществляется по стандартной sync() вида ei:halt иначе никак. хоть закидайся в экран данные, они не покажутся без этой конструкции. данный метод прекрасно работает тогда, когда нужно обновлять весь экран (точнее, всю картинку, каких бы она размеров не была). а вот на динамичных сценах, типа как в соседней теме про си, там пример с шариками, там возникают разные косяки. например, если использовать алгоритм из плеера, что шарики отрисовываются со шлейфом (следом) т.е. требуется сохранять область под шариками, рисовать шарики, делать синх, потом восстанавливать область. если делать это столько раз, сколько у нас на экране объектов (шариков), то это получается сильно накладно. дешевле делать save/restore всего экрана. в документации сказано, что есть два управляющих бита в номере видеостраницы - бит 2 и бит 3. бит 3 отвечает за прозрачный цвет (ff). с ним проблем нет. а вот как работать со 2м бытом, это вопрос "на мильён".
если оставлять всю логику не изменой, но в странице видеопамяти воткнуть 2й бит, то шарики не появляются вообще! есть фоновая картинка и всё. если сделать вывод шариков сразу в 1й экран, то шарики есть, но при выводе они постоянно моргают. если отбросить вариант логики плеера и не делать копии на 1 экран, а всё выводить на 0й, то работа 2го бита в видеостранице не влияет ни на что. шарики есть и след за ними тоже на месте. просмотрел в дебагере как работают такие демки как fish. там нет использования прозрачности, на экран вывод без акселя, экран всегда 0й. т.е. пример плохой. в 3d_stars там есть переключение экранов, но я что-то не понял, как там оно работает. когда я делаю подобное, то получаю сплошное моргание.


30 Mar 2015 20:45
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...

_________________
:dj: https://mastodon.social/@Shaos


30 Mar 2015 21:00
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Shaos wrote:
Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...

я согласен с тем, что когда делаешь какие-то системные программки или игры в которых большая часть спрайтов фиксированного размера, всего вроде даже хватает. вот можно глянуть на тот же thunder in the deep. там даже прозрачность не используется. фоновой картинки нет. фон вообще там чёрный. все спрайты карты и сам ГГ одних размеров. тут даже аксель, в целом, не требуется. но когда хочешь сделать какую-то "демку" или игру в которой около десятка подвижных объектов, да ещё и поверх какого-то фона (карты), то всего того, что используется в TITD уже мало. нужна и прозрачность и работа с областями под объектами и прочее.


30 Mar 2015 21:47
Profile
Doomed
User avatar

Joined: 11 Dec 2003 14:34
Posts: 413
Reply with quote
Sayman wrote:
Shaos wrote:
Я в такие тонкости не вдавался - никогда не проверял все доступные режимы - всегда использовал только базовый минимум, которого было достаточно для моих программулек...

я согласен с тем, что когда делаешь какие-то системные программки или игры в которых большая часть спрайтов фиксированного размера, всего вроде даже хватает. вот можно глянуть на тот же thunder in the deep. там даже прозрачность не используется. фоновой картинки нет. фон вообще там чёрный. все спрайты карты и сам ГГ одних размеров. тут даже аксель, в целом, не требуется. но когда хочешь сделать какую-то "демку" или игру в которой около десятка подвижных объектов, да ещё и поверх какого-то фона (карты), то всего того, что используется в TITD уже мало. нужна и прозрачность и работа с областями под объектами и прочее.


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

_________________
Vasil Ivanov
vasil-i@yandex.ru


03 Apr 2015 22:00
Profile
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Quote:
с гориз. скроллингом экрана и всех железных фитч этой игрушки нет в стандартной (и доступной) плис-конфе.

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


07 Jul 2015 20:03
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Подкидывай - можно прямо текстом в форум - для истории так сказать...

_________________
:dj: https://mastodon.social/@Shaos


07 Jul 2015 21:26
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Shaos wrote:
Подкидывай - можно прямо текстом в форум - для истории так сказать...

ну тогда вот:
Quote:
В официальной документации есть информация о том, что при работе с графическим
экраном есть несколько методов для вывода графики:
- обычный;
- прозрачный цвет;
- временный;
Режим включается через указание номера страницы в порт окна процессора. Известно,
что для графического экрана у нас доступно 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.


так же прикрепляю архив с шариками и их исходниками. подробности в balls.txt.


Attachments:
balls.zip [134.4 KiB]
Downloaded 448 times
07 Jul 2015 23:38
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Премного благодарен

_________________
:dj: https://mastodon.social/@Shaos


08 Jul 2015 15:54
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Попробовал balls.exe запустить в своём эмуле - выводит непонятности в терминал:
Code:
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
...

и рисует такое:

Attachment:
balls1.jpg
balls1.jpg [ 215.9 KiB | Viewed 7486 times ]


Прозрачность я скажем поправлю, а вот зачем порт C9 (RGMOD) трогался? У меня он считается неизвестным, а в ZXMAK2 он вроде вообще никак не используется - просто значение запоминается и потом отдаётся

_________________
:dj: https://mastodon.social/@Shaos


28 Nov 2020 16:17
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Вроде сделал поддержку этих двух битов - теперь рисует так:


Attachments:
balls2.png
balls2.png [ 68.76 KiB | Viewed 7482 times ]

_________________
:dj: https://mastodon.social/@Shaos
28 Nov 2020 20:34
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
Порт 0xC9 (RGMOD) это переключение активного экрана. грубо говоря (по спектрумовский), переключает 0й и 1й экран, делая один из них видимым, второй теневым.
Code:
      in a,(rgmod)
      and 1
      xor 1
      out (rgmod),a

переключение через 0й бит. если D0 = 0, то активный 0й экран. ну и D0 = 1, значит активный 1й экран.
Если там и есть ещё какие-то значения для других битов, то они мне не известны.
Quote:
Вроде сделал поддержку этих двух битов - теперь рисует так:

рисуется так потому, что не полностью реализованы режимы экрана. как я тут шарики рисую:
сначала я вывел фоновую картинку. режим экрана был 0x50 (обычный).
рисую шарики как 0x50 or %00001100, с включённой прозрачностью и с режимом temporary (не придумал более другого названия) - данные не попадают в ОЗУ! они пишутся сразу в vram. для того, чтобы переместить шарик (нарисовать на новой координате) мне нужно старый шарик затереть. координаты текущего положения шарика у меня есть. я перечитываю из ОЗУ квадратик фона и перезаписываю его в эти же координаты. бац и шарик стёрт, а фон восстановлен. переходим к следующему объекту.

кстати, в демке немерянно говнокода. кто бы оптимизировал её?


29 Nov 2020 22:55
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Спасибо - я так и подумал

Есть у меня пара мыслей как в эмуль 2 экрана воткнуть - это не так чтобы очень быстро, но выполнимо - буду отлаживаться на твоих шариках и ротозуме :)

_________________
:dj: https://mastodon.social/@Shaos


29 Nov 2020 23:11
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
На реальном Спринтере оно должно запускаться вот так:

Image

_________________
:dj: https://mastodon.social/@Shaos


09 Dec 2020 21:04
Profile WWW
Maniac

Joined: 05 Oct 2009 19:44
Posts: 223
Location: 212.164.105.5
Reply with quote
да я просто текстурки обновил. эти поинтереснее выглядят (как мне кажется). в архиве что в телеге выложил всё есть. можно заменить на свои.


09 Dec 2020 21:21
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 15 posts ] 

Who is online

Users browsing this forum: No registered users and 5 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.