как человек, когда-то патчивший графику "элиты", не могу промолчать
во-1, кадр в "элите" рисуется не на экране, а в буфере (и потом чересстрочно перебрасывается в экран)
во-2, никто в здравом уме не будет рисовать отрезки по координатам следующего пикселя
вычисляют сразу соседний адрес (байтовая маска на Спеке - как бы часть адреса)
именно ради ускорения и упрощения вычислений
у меня получилось емнип около 80 тактов на пиксель в среднем для финальной отрисовки без отсечения
это в цикле, а применив таблицы или развернув код (и без ксора) можно рисовать примерно вдвое быстрее
(а с альтернативной раскладкой буфера или нового экрана - еще быстрее и гораздо короче)
жуть кошмарная для "быстрой видеокарты" (c)
а вот как эти же два пикселя можно вывести на стандартном медленном Спектруме:
ld hl,$4000
set 7,(hl)
set 6,(hl)
40 тактов!!
самая (?) же быстрая процедура установки точки по произвольным новым координатам - только 58 тактов
уж извини, но вывод спрайтов тоже запланирован неудачно
неудобен ни для написания новых, ни для улучшения старых игр
и цвета урезаны неоправданно
Прихожу без разрешения, сею смерть и разрушение...
Так вот и я говорю, ставить гигантскую плис с быстрой памятью что бы получить ещё медленее чем было.
Почему нельзя тупо сделать переброску спрайтов с помощью дма, пусть даже и в 4-8 слоёв экрана, а с цветовой компонентой я до сих пор ничего не понял, что то типа древнего CGA 35-летней давности ?
Почему пиксель так сложно рисовать? почему нельзя выставить цвет и потом только координаты кидать?
LD A,color
LD (meteor_pix_color),A
LD H,y
LD L,x
LD (meteor_pix_coord),HL
inc l
LD (meteor_pix_coord),HL
inc l
.....
по сути пиксель ставится за 16 тактов - LD (nn),HL
а цвет уже заранее выставлен и его всегда можно поменять
с спрайтами та же байда, можно уложиться в 30-40 тактов на спрайт размером с экран
--------------------------
Кстати мысля, пиксель по LD (nn),HL можно предусмотреть в любой видеокарте, по сути достаточно только адрес порта в памяти указать а процедура вывода изображения растровой графики будет работать на любой видеокарте.
Последний раз редактировалось Nesser; 30.09.2016 в 01:18.
и так ли уж координаты нужны, по мне лучше уж привычные адреса плюс возможность на ходу раскладки менять
тогда уж за 7 тактов ld (hl),reg - и легко пропатчить старые процедуры, и новые работать быстрее будут
больше двух цветов (один прозрачный) для векторов и спрайтов в спектрумовском духе просто не нужно
для многоцветных спрайтов - блиттер или недокод на девайсе, перебивающий z80-команды в нужных местах
а также для модернизации старых игр вообще без правки старого кода (только приписать спецзагрузчик)
а три цвета - это же ни рыба ни мясо: и со старым кодом не сочетается, и картинку не особенно улучшает
Прихожу без разрешения, сею смерть и разрушение...
Имея карту с таким гигантским объемом памяти частотами и ресурсами ! Вообще лучший вариант загрузил сразу всю графику в карту, картинки, спрайты, шрифты, и прочее, а дальше команду в окне регистров карты
Nesser, Lethargeek зачем так все сложно зачем мучить одно место (моск) ,не надо слои, и остальной огород, например режим карта с 256X192 и 8 битным цветом на точку, это экран 48 кб для такой карты мелочь, пример для переделки игр, что скажете ?
Вся графика уже загружена в карту и мирно там лежит все время по полочкам (банкам) -
банки имеют размер 64кб этого всегда хватит даже для картинки размером в полный экран 48кб , а в поле 64кб очень удобно работать одной регистровой парой !
;---------------------------------------------------------------------;
сохранили стек
LD SP,sprite ;установили стек в массив команд карты
POP HL
LD (#3A00),HL ;регистр карты который задает в экране карты адрес начала вывода спрайта (либо если сделать два режима по адресам или точкам будет задавать по точкам 256 на 192 как раз будет старший байт координата по точкам X , младший байт Y)
POP HL
LD (#3A02),HL ;регистр карты который задает номер банка памяти (1 например) в карте в которой загружена наши графика
POP HL
LD (#3A04),HL ;регистр карты который задает где лежит спрайт в памяти карты (можно задавать банки 1,2,3 и т.д.) в карте, банк будет размером 64кб удобно!
POP HL
LD (#3A06),HL ;регистр карты который задает размер спрайта X,Y
POP HL
LD (#3A08),HL ;регистр карты который задает команду карте перекинуть спрайт из памяти карты в экран карты
восстановили стек
sprite DEFB
#0000 адрес в экране карты куда будет перекинут спрайт
#0001 номер (1) банка размером 64кб где лежит наш спрайт с которым сейчас работаем
#8000 адрес спрайта в банке 1 памяти карты
#0808 размер спрайта X,Y
#0001 1- команда перекинуть спрайт
;------------------------------------------------------------------;
Учитывая частоты карты, спрайт мгновенно на экране.
А еще более изумительный вариант, будем считать что выше написанное это кидать не в экран, а в буфер экрана карты, а потом по команде в какой то регистр подготовленный буфер перекидывается в экран,
КРАСОТА, СКОРОСТЬ, ПРОСТОТА !!! Именно для переделки старых игр, так как мы освободим память ZX и код игры в плане управления координат графики в старой игре не надо трогать, в нужном месте только поставить то, что я привел ! Сказка для переделки старых игр c новой графикой ! Надо только загрузчиком загрузить с диска новую графику в карту, в игре минимум изменений и они очень очень простые !
Что то подобное и для точек, линий. Та же элита , на этапе когда мы получили в игре код координат линии на экране X,Y , мы в коде где должна рисоваться эта линия ставим свой код типа вышеприведенного но для работы с линиями а не спрайтами, и задаем новый цвет и т.д. и вот новая раскрашенная элита !
ZST что скажите, зачем спеку с 3.5мГц экран фул шд ? Это тогда надо называть карта для статической графики. А если концепт изменению не подлежит, скажите, вам голову не будут морочить.
PS правил по мере мыслей.
Последний раз редактировалось JV-Soft; 30.09.2016 в 04:40.
Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.
Большая FPGA нужна чтобы влезли все регистры и схемы управления. Объем FPGA не такой уж большой. В ней всего 4602 LE, то есть 4602 однибитных триггра. Этого хватит только на 575 восьмибитных регистров. А их для управления режимами Метеора может понадобиться много. Кроме этого для работы видеокарты надо много LE.
Приведу пример Alone Coder:
В приведенном примере надо учесть длительность команды DEC D. Тогда длительность будет 58 + 4 = 62.Код:по координатам,заданным в регистрах L=y, E=x, в произвольном месте экрана(и даже за экран)за 58(!)тактов ста- вится точка.Регистр C равен старшему байту адреса таблиц('TABLE), регистр D=C+2. LD H,C LD A,(DE);x/8 \ INC D |-даёт младший байт OR (HL);L(y) / INC H LD H,(HL);H(y) LD L,A LD A,(DE);byte(x) (X)OR (HL);метод постановки точки LD (HL),A Если вместо последних 2 команд вставить AND (HL),то это будет функция POINT. Чтобы процедура работала многократно, в конце её поставьте DEC D.
Так как в этом примере координаты уже загружены в регистры, то и в моем их считать не надо. Тогда 82 - 10 - 10 = 62.
Скорость такая же, но точки рисуются произвольными цветами без клешинга атрибутов.
Скорость будет зависеть от оптимизации команд. В моем примере использовались команды для рисования спрайтов.
Если мы добавим команду для рисования точками, то будет намного быстрее.
Согласен. Если добавить новую команду, которая сразу будет рисовать точку при загрузке координат и координаты однобайтовые, то будет 16 тактов. При этом цвет можно менять в произвольный момент и рисование будет происходить без клешинга.Почему пиксель так сложно рисовать? почему нельзя выставить цвет и потом только координаты кидать?
LD A,color
LD (meteor_pix_color),A
LD H,y
LD L,x
LD (meteor_pix_coord),HL
.....
по сути пиксель ставится за 16 тактов - LD (nn),HL
а цвет уже заранее выставлен и его всегда можно поменять
Только это уже скорее аппаратная точка получается. Добавил регистры:
point_x — координата X при рисовании точки. Координата однобайтная.
point_y — координата Y при рисовании точки. Координата однобайтная. После записи координаты Y точка рисуется/стирается текущим инструментом.
- - - Добавлено - - -
Да, это будет удобно и быстро. Если банки будут по 64 К, то двумя байтами можно указать адрес начала спрайта в банке.
В Метеоре каждый слой состоит из двух частей/буферов. Пока один изображается на другом можно рисовать. А по прерыванию их можно менять местами. Адресация, вернее координатыы при этом не меняются.Учитывая частоты карты, спрайт мгновенно на экране.
А еще более изумительный вариант, будем считать что выше написанное это кидать не в экран, а в буфер экрана карты, а потом по команде в какой то регистр подготовленный буфер перекидывается в экран,
Тут одна трудность - графику надо найти и скопировать. Если отдельно загружать, то увеличится размер игры. Но может это как вариант использовать.КРАСОТА, СКОРОСТЬ, ПРОСТОТА !!! Именно для переделки старых игр, так как мы освободим память ZX и код игры в плане управления координат графики в старой игре не надо трогать, в нужном месте только поставить то, что я привел ! Сказка для переделки старых игр c новой графикой ! Надо только загрузчиком загрузить с диска новую графику в карту, в игре минимум изменений и они очень очень простые !
FULL HD для точного изображение пикселов на экране. Это не так важно. Можно остановиться на VGA 640x480 60 Hz.Что то подобное и для точек, линий. Та же элита , на этапе когда мы получили в игре код координат линии на экране X,Y , мы в коде где должна рисоваться эта линия ставим свой код типа вышеприведенного но для работы с линиями а не спрайтами, и задаем новый цвет и т.д. и вот новая раскрашенная элита !
ZST что скажите, зачем спеку с 3.5мГц экран фул шд ? Это тогда надо называть карта для статической графики. А если концепт изменению не подлежит, скажите, вам голову не будут морочить.
Разумные предложения обсуждаются и применяются. Обычно только критика и слишком сложные предложения. Надо все делать просто и удобно для программирования.
Последний раз редактировалось zx-kit; 30.09.2016 в 04:45.
"L-256"
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Это на мой взгляд упрощение переделки старой игры, а не усложнение, вот смотрите есть спрайтовая игра, из нее естественно выдираются родные спрайты и раскрашиваются, далее мы эти спрайты компонуем одним файлом, и делаем простой загрузчик который грузит это все в карту перед запуском игры, нам не надо тратить огромное количество времени на впихивание этой графики в игру, да и не получится это у нас, не хватит ZX памяти на новую графику. А остаток переделки игры вставить короткие участки кода, что я приводил выше, когда игра посчитала координаты для родного спрайта мы их берем за основу и закидываем в карту , и как по мне это просто удовольствие в переделке игры а не мучение
Пример с использованием стека и одного регистра HL еще избавляет нас каждый раз запоминать все регистры, просто перед процедурой запомнили HL, запомнили адресс родного стека игры, после отправки данных в карту восстановили.
- - - Добавлено - - -
PS и еще в такой реализации мы разгрузим на 90% процессор !!! Ему же не надо самому заниматься перекидыванием спрайтов из памяти в экран, а карта из своей памяти в свой экран может делать это элементарно, согласны ?
- - - Добавлено - - -
PPS такой концепт на мой взгляд может привлечь потенциальных разработчиков/передельщиков игр своей простотой переделки и программирования
Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.
Может быть так будет лучше. В играх спрайты хранятся по разному. После преобразования спрайты можно привести к единому формату. Тогда понадобится одна процедура копирования спрайта в FPGA. Не обязательно даже перекрашивать спрайты. Просто перекодировать из формата 2 бита на точку в 16 битов на точку с сохранением цветов. Раз цвета у нас уже в спрайтах, то в программе их указывать не надо будет.
"L-256"
Совершенно верно, но я бы еще предусмотрел 8 бит на точку и экран 256x192 , это надо для простоты написания новых программ, игр, демо ! для режима карты в которую мы не будем предварительно ничего загружать, а будем например real time рисовать сами, так как оперировать в этом случае с цветами 8 бит проще аккумулятором (A) , при 16 бит на точку все очень усложнится для real time
Кстати правильно ли я рассуждаю что мы фактически освободим процессор если карта будет иметь предварительно загруженную график в свою память ?
- - - Добавлено - - -
PPS готов помочь более детальным концептом, что бы хорошие идеи не остались на бумаге...
- - - Добавлено - - -
А если нам вообще оставить один стандарт экрана (8 бит 256x192) то аппаратно мне видится все так - память экрана одна микросхема SRAM 64кб , память графики одна, две SRAM 512кб и FPGA, естественно цена сразу минимальна, более широкий рынок покупателей и сборщиков если будет комплект для сборки.
- - - Добавлено - - -
Потратив на комплектующие 5$ лучше больше взять за свою работу, нежели потратить 50$ на железо и 5$ добавлять за свою работу (сборку)
- - - Добавлено - - -
Ну и как всегда добавлю на всякий случай, для меня это хобби, мне с этого ничего не надо кроме удовольствия)))
- - - Добавлено - - -
Совсем ориентировочный концепт, мечта программиста ZX на мой взгляд.
- - - Добавлено - - -
Это будет по истине быстрая карта, которая разгрузит практически весь процессор , что можно даже процессором будет MOD играть !
Также имея аппаратную линию и точку не только по адресации через память как и раньше в ZX экране, но еще и через X,Y эффекты с точками можно рисовать очень быстро, ведь Z80 не надо пересчитывать координату X,Y в адреса экрана.
- - - Добавлено - - -
На счет клешинга я бы сделал так - старая игра рисует фон нашими новыми красивыми 256 цветными спрайтами, далее к примеру на поле с травой она должна вывести спрайт героя , мы карте говорим через определенный регистр какой спрайт нарисовать сверху фон или героя , и каким методом - XOR,OR,AND , и все, без всяких слоев в памяти и прочих заморочек.
Вот пример со спрайтом сена на левой ноге по вышеописанному принципу -
![]()
![]()
- - - Добавлено - - -
Естественно XOR,OR или AND делает сама карта при переброска спрайта, линии, или точки из SRAM графики в SRAM экрана, быстро и просто, а Z-80 отдыхает ну или свои дела делает )
Последний раз редактировалось JV-Soft; 30.09.2016 в 08:25.
Увы общий формат форума вышел из рамок моего любимого места , более тут не бываю.
так я сам всегда был против слоёв (но за 16-битные пиксели по ряду причин) и за чистый блиттер для рисования
только это надо сделать необязательным, чтоб не переделывать, когда лень или двух цветов объектам достаточно
для удобства переделки в старый код лучше не вставлять ничего (там и места может не оказаться)
помечаем несколько адресов, где старый z80 код непосредственно пишет или читает графику
при выборке команды с этого адреса видеокарта параллельно выполняет свою команду
причем значения на шине данных и шине адреса Спека может применить как параметры
не на мой) блиттер хочется уметь настраивать тоньше
и зачем память видеодевайса делить на части?
Прихожу без разрешения, сею смерть и разрушение...
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)