PDA

Просмотр полной версии : Аппаратный горизонтальный скролл в Радио 86РК



NEO SPECTRUMAN
03.04.2017, 17:13
Аппаратный горизонтальный скролл в Радио 86РК
АХТУНХ
Текст ниже скорей всего памятка самому себе
Лучше и надежней использовать скролл с использованием перемещаемого "конца строки"
чем то что ниже

или как сделать горизонтальный скролл
на любом компьютере с изменяемым начальным адресом старта экрана с точностью до байта (хотя не обязательно)
и линейным строением экрана

я много говорил про аппаратный скролл у РК
который у него из коробки НО
Если вертикальный скролл очевидно как реализовать
то с горизонтальным нужно уже немножко подумать (мну думал минуты 2...)
(не имею малейшего понятия как его делал vinxru)

НИКАКОГО ГОТОВОГО КОДА В ПЕРВОМ ПОСТЕ НЕТ!


Суть алгоритма такова (см интуитивно понятный картинко ниже)
Может для кого то это и очевидно
но не для меня
да и готового софта со скроллом я не вижу...
Для наглядности возьмем размер экрана 3х2 знакоместа
Вся карта в виде столбцов 1,2,3,4,5,6,7... (на картинках не указаны!!!)
Комментарии написаны для каждой строки (номер строки на картинке не указан!!!)


http://zx-pk.ru/attachment.php?attachmentid=60463&d=1491227810

1. Исходное положение на экране столбцы 1,2,3

2. Сдвигаем видео память на +1 в результате чего на экране столбцы 2,3 в последнем столбце появляется фиг знает что
3. Дорисовываем последний столбец
по смещению -1 от текущего начала видео памяти
для того чтобы в будущем вернуть видео память в исходное положение (ну не можем же мы ее сдвигать бесконечно)
отрисовываем одно знакоместо из изображения, которое появится намного позже
которое будет находиться текущее_положение + количество_видео_памяти
в нашем случае 1 + 6
рисуем одно знакоместо из 7-го столбца 1-й строки
дальше по смещению + ширина_экрана (выделенное под это количество видео памяти, а не настройки вг75) от текущего положения рисуем знакоместо из 4-го столбца
прибавляя ширину_экрана переходим к следующей строке дорисовываем 4-й столбец

4. см пункт 2. (на экране столбцы 3,4,*)
5. см пункт 3. (только по смещение -1 рисуем знакоместо из 8-го столба 1-й строки)
6. см пункт 2. (на экране столбцы 4,5,*)
7. см пункт 3. (только по смещение -1 рисуем знакоместо из 9-го столба 1-й строки)
8. см пункт 2. (на экране столбцы 5,6,*)
9. см пункт 3. (только по смещение -1 рисуем знакоместо из 7-го столба 2-й строки)
10. см пункт 2. (на экране столбцы 6,7,*)
11. см пункт 3. (только по смещение -1 рисуем знакоместо из 8-го столба 2-й строки)

12. и теперь самое интересно
мы возвращаем начальный адрес видео памяти в исходное положение
а у нас там уже почти готово новое изображение и всего лишь одно последнее знакоместо неправильное
(на экране столбцы 7,8 и большая часть 9)
13. дорисовываем последнее знакоместо
и можно переходить к пункту 2

Что в конечном итоге это нам дает

нам не нужно перерисовывать все 3К чтобы сдвинуть все изображение

достаточно перерисовать один столбец + еще 1 байт итого каких то 40 байт

но за скорость нужно платить
требуется дополнительное место, куда будет перемещаться окно
в итоге под видео память придется отдать еще столько же - 1

этот вариант для быстрого фреймового обновления
с не большим количеством спрайтов на экране

тк тут сразу после перерисовки экрана
начинается гонка с лучом (а в нашем случае с DMA)
нужно немедленно обновлять сдвигать спрайты (при том даже те которые статичные на экране!!!)
пока их необновленное положение не успело попасть в буфер вг75
иначе будут мигать спрайты (в данном случае дрыгаться и рваться)

из оптимизаций
если спрайт движется со скоростью экрана в ту же сторону
то его можно не перерисовывать



для не фреймовых скроллов
где спрайтов много и они большие
уже придется выделить памяти в 4 раза больше чем экранная область!!!!
подход тот же
но отрисовывать придется теперь по 2 столбца + 2 байта
и менять каждый раз буфер
так же теперь ширина экрана должна быть кратная 2-м

вот начало работы алгоритма
http://zx-pk.ru/attachment.php?attachmentid=60464&d=1491227825 http://zx-pk.ru/attachment.php?attachmentid=60466&d=1491233772
1. Исходное положение

В отличие от предыдущего тут используется 2-й экранный буфер
который при старте уже должен быть заполнен изображением проскролленым на одно знакоместо!!!
...хотя проще будет нарисовать смещение тем же кодом и держать при старте просто 2 одинаковых экрана (правая картинка)...

2. выбираем 2-й экранный буфер
3. в первом буфере дорисовываем все изменения (включая спрайты и прочую белиберду)
4. выбираем 1-й экранный буфер
итд

в итоге мы получаем такую же быструю двигалку экрана


из минусов
в 4 раза больше видеопамяти!!!!
спрайты теперь нужно рисовать в 2 разных буфера
и хранить информацию для восстановления фона или прочие подобные вещи
в количестве 2 раза большем!!!!

изображение теперь идет с задержкой
но нам на это пофиг ибо везде так и мы это не замечаем даже...


так же можно реализовать скролл в обе стороны
но для этого нужно за раннее заполнить вторую часть видео памяти тем, что будет выведено на экран при движении назад

с таким же успехом усложнив код можно делать скролл с разным шагом

...в принципе можно запилить скролл во всех 4-х направлениях...
но памяти это займет... (размер видео памяти * 2 * 2 * количество буферов)

...разве что сделать маленькое окошко слева сверху как у zx81 )))))


при всем этом можно пользоваться средствами экономии видео памяти (конец строки стоп ПДП)
и скорей всего даже нужно (правда тогда придется больше перерисовывать изображение)

с атрибутами же придется сложнее
самый оптимальный вариант режим видимых атрибутов
тогда больших проблем не возникнет

или вариант атрибут на каждый байт видео памяти (при режиме невидимых атрибутов)
каждый второй байт заполнить "штриховкой"
а изменять только сами атрибуты при перерисовке (каждый второй байт)
в итоге получим большие цветные чанки со скроллом...


В атаче в архиве непожатиые изображения
на которые и рекомендуется смотреть

NEO SPECTRUMAN
04.04.2017, 00:04
Цвета в 86РК нет насколько я помню.
Для меня РК понятие широкое
РК86, Апогей, Микроша, Партнер

NEO SPECTRUMAN
04.04.2017, 15:33
вы простую и понятную каждому вещь описали так что в глазах рябит
ну кому как
мне с ходу не было понятно какой именно готовить кадр для возвращения видео памяти в исходное положение
пока не нарисовал картинку.
а глядя на нее все очевидно



Опять же надо учитывать реалии, перерисовывать придется 4*row (1 заново, 1 копировать и 2 чистить) для бесконечного скролла.
см картинко
нужно перерисовывать только ОДИН столбец и рисовать всего 1 байт подготавливая кадр для возвращения видеопамяти в исходную позицию
в 2 стороны скролл абсолютно бесконечен (если при старте заполнить вторую часть на случай если мы сразу захотим двигаться назад)




Комбинация с вертикальным скроллом расход памяти конечно не увеличит, рисовать только придется не столбцы а строки. Расход памяти ровно на 2 экрана всегда.
и как мы без перерисовки столбцов вообще получим горизонтальный скролл???
тут нужно рисовать как столбцы так и строки

и как можно уместить это в 2 экрана????

нет ну если он всегда в одну сторону по диагонали то да
память под новый кадр быстро освобождается

а у нас движение во все 4 направления

вот пример
5 движений вправо
3 вниз

http://zx-pk.ru/attachment.php?attachmentid=60485&d=1491308343
Желтый - первая строка видео памяти
Зеленый - вторая строка видео памяти
Красный - запись
1-я цифра в квадрате номер строки, 2-я номер столбца
и да на картинке не дорисованы еще некоторые записи при скролле вниз (в последних двух строках)
или на ней вообще нарисована херня при скролее вниз (там несколько вариантов развития событий)


после 5 скроллов вправо у нас готово следующее изображение для еще одного скролла вправо
но никак не для скроллов вниз

при том я теперь вообще не понимаю как сделать бесконечный скролл во все стороны
если повторять эту последовательность то нужна бесконечная память с таким подходом

как готовить следующий кадр(длв возвращения в исходную позицию) или хотя бы часть его
когда мы не знаем какой именно он должен быть
мы можем двигаться произвольно в 8-ми направлениях

нужно или готовить их несколько или хз что (явно не 2)

периодическую полную перерисовку всех 3К я не допускаю!!!!
это уже не аппаратный скролл

максимум должно быть обновление 4-5 строк\столбцов...

b2m
04.04.2017, 15:50
при том я теперь вообще не понимаю как сделать бесконечный скролл во все стороны
если повторять эту последовательность то нужна бесконечная память с таким подходом
Рано или поздно, когда мы подойдём к началу или концу буфера, нужно будет иметь копию в другом конце буфера, чтобы незаметно для игрока переключить адрес буфера. Так что время от времени придётся копировать весь экран.

NEO SPECTRUMAN
04.04.2017, 15:52
Так что время от времени придётся копировать весь экран.
так этого я и хочу избежать
это будет выглядеть как внезапное замирание\спотык

при том мы наткнемся на него снова и снова
если будем каждый раз менять направление движения на противоположное

b2m
04.04.2017, 15:54
при том мы наткнемся на него снова и снова
если будем каждый раз менять направление движения на противоположное
Чтобы этого избежать, можно перемещаться в середину буфера.

NEO SPECTRUMAN
04.04.2017, 15:55
Чтобы этого избежать, можно перемещаться в середину буфера.
ну тогда нам нужно будет еще больше памяти

+ проблему это не решает
какой именно готовить кадр для перемещения?
пока мы подрыгаемся по кругу
построенный потеряет свою актуальность или превратится в кашу...

b2m
04.04.2017, 15:59
ну тогда нам нужно будет еще больше памяти
3 экрана - не так много.

NEO SPECTRUMAN
04.04.2017, 15:59
Точнее, как заставить ПДП перепрыгивать невидимую часть буфера?
всмысле как?
перекидываемые данные линейны на все 100
и с этим нам нужно бороться

со скроллом по одной оси проблем нет...

и тут кажется о чего там добавлять еще одну ось
тьфу...
а нет...

b2m
04.04.2017, 16:03
какой именно готовить кадр для перемещения?
Актуальный, естесственно. После того, как мы переместимся в средину буфера, проблема на время исчезнет.

NEO SPECTRUMAN
04.04.2017, 16:05
3 экрана - не так много.
не 3

мы же не можем перестроить по середине новый кадр моментально

нам еще нужно рисовать поверх спрайты

придется делать второй экранный буфер
в котором будет строится изображение пока отображается первый

а это уже 6 экранов
а это уже...

в принципе если дать уехать по глубже чтоб кадры не пересекались



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

нужно видимо как то совместить несколько методов
чтоб при движении в одну сторону готовился кадр с учетом движения в эту сторону

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

ZEvS
05.04.2017, 10:59
Мне думается, должно быть так:
1.У нас удвоенное пространство, ПДП смотрит в первый буфер.
2.Теперь делаем сдвиг на один байт, при этом у нас неверным оказывается один столбец из байтов справа и мы его дорисовываем.
Также тот байт, который выпал из поля зрения слева, мы его тоже заполняем, но данными из будущего третьего экрана.
3. Повторяем пункт 2, до тех пор пока ПДП не будет показывать второй буфер целиком.
4. Переключаем ПДП снова на первый буфер, а там уже побайтно нарисован тоже самое, что во втором, но уже смещенное еще далее на байт.
5. Переходим на пункт один.

Таким образом надо обновлять столбец байтов впереди себя и один байт позади.

b2m
05.04.2017, 13:19
при том при движении в одну сторону мы будем спотыкатся об это через один и тот же интервал времени
Ну тогда сделай так, чтобы в буфере всегда были два актуальных кадра. Один нормальный, а другой с разрывом на границе буфера. То есть в буфере будет сначала правая часть одной копии, затем полный экран, затем левая часть первой копии.

NEO SPECTRUMAN
06.04.2017, 16:53
Мне думается, должно быть так:
1.У нас удвоенное пространство, ПДП смотрит в первый буфер.
2.Теперь делаем сдвиг на один байт, при этом у нас неверным оказывается один столбец из байтов справа и мы его дорисовываем.
Также тот байт, который выпал из поля зрения слева, мы его тоже заполняем, но данными из будущего третьего экрана.
3. Повторяем пункт 2, до тех пор пока ПДП не будет показывать второй буфер целиком.
4. Переключаем ПДП снова на первый буфер, а там уже побайтно нарисован тоже самое, что во втором, но уже смещенное еще далее на байт.
5. Переходим на пункт один.

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

проблема возникла при попытке совместить вертикальный и горизонтальный скроллинг

ZEvS
07.04.2017, 01:57
По хорошему, нужна пересылка "память-память" через другой канал ПДП, тогда можно что угодно делать...

NEO SPECTRUMAN
07.04.2017, 16:38
По хорошему, нужна пересылка "память-память" через другой канал ПДП, тогда можно что угодно делать...
Ну этот ПДП с трудом выполняет задачи своего первого канала по перекидыванию...
а тут его еще нагрузить
+с таким же подходом когда вообще процу выполнять код?

ZEvS
08.04.2017, 02:37
Да, я не спорю.
Компьютер слаб, но ведь за это мы его так и любим. И вся ретро философия сводится к этому.
Поэтому, я делаю свою "видеокарту" чтобы вдохнуть новую жизнь в старые игры, над которыми работали
ЛЮДИ.
Не ради какого-то заработка, не ради "лайков", а просто ХОЧУ.
Что выйдет посмотрим. Может все это зря, хотя мое мнение, что ничего не бывает зря.

inozemcew
18.07.2017, 11:48
Не нужно никаких дополнительных буферов. Фокус в том, что экран не обязан начинаться с самого младшего адреса. Контроллер ПДП гоняет же данные по кругу и начало экранной области может совсем не совпадать с началом экрана. Более того, для управления процессом синхронизации ВГ и ВТ не нужно перепрограммирование контроллеров вообще. Есть же волшебный код F3h - "конец изображения, стоп ПДП". Там, где он стоит - там и будет конец экрана. Достаточно каждый фрейм сдвигать этот код вперед/назад - и мы получим скроллинг в любом направлении без задействования дополнительной памяти.

NEO SPECTRUMAN
20.07.2017, 00:02
Ага.
Я сразу и не понел

Я считал что можно сделать только безостановочный скролл подобным образом
(когда ДМА перекидывает больше чем нужно)
что то это совсем не подобный образ

vinxru что то такое описывал вроде..

интересно ПДП без задержек переходит на следующий круг?

Pyk
25.07.2017, 23:49
интересно ПДП без задержек переходит на следующий круг?
Задержек нет.

А в целом метод интересный, только вот сразу не соображу, можно ли избежать пустых кадров при скроллинге вверх (влево)? Если новый F3 располагается дальше, чем старый, то новый попадет в начало кадра и, как следствие, должен проскочить пустой кадр, и только со следующего появится смещенная картинка...

Кто-нибудь пытался сделать что-то подобное?

inozemcew
24.08.2017, 15:19
можно ли избежать пустых кадров при скроллинге вверх (влево)?
Можно. Нужно запрограммировать контроллер ПДП на одну строку меньше, чем отображается на экране. Код F3h ставить в конце предпоследней строки. Последняя строка будет чисто черной. Обмена ПДП во время ее отображения тоже не будет.
Для скрола вверх просто переносим код F3h на одну строку ниже. Вг75 отображает на месте нижней строки самую верхнюю, затем в следующем кадре все строки сдвигаются на одну вверх и код F3h попадает в конец предпоследней строки, а последняя строка будет опять черной. Для скрола влева все тоже самое, но F3h переносится только на один байт вперед.
Вот как-то так оно и работает. Под "строками", разумеется, подразумеваются не 25 используемых строк, а все строки составляющие кадр.

SegaBoy
26.05.2019, 18:02
Прокручивающийся во всех направлениях Пикачу для Радио, Микроши и Апогея.

69092

NEO SPECTRUMAN
26.05.2019, 18:12
во всех направлениях
нераскрытый потенциал РК-шки так и прет во всех направлениях...


3Ы лично я вернусь к пилянию софтварных хайресов
не раньше чем обзаведусь железным РК

для обзаведения железным РК
ужо прикупил пару сотен микросхем
и с десяток вг75

осталось только его спаять и заставить работать
только вот когда

inozemcew
06.06.2019, 13:44
[QUOTE=SegaBoy;1014147]Прокручивающийся во всех направлениях Пикачу для Радио, Микроши и Апогея.


Красиво. Теперь надо сделать, чтобы картинка прокручивалась не по всему экрану, а в окне 80х33. И цвета добавить.
А если малость подзаморочиться с экранными страницами, то и амижный боинг можно реализовать. Ну, почти ;)