Да черт его знает как правильнее... Надо подумать. Основной как бы посыл - при переключении в такой режим не должно быть необходимости сразу перепахивать всю графику.
Вид для печати
В Метеоре применяется почти такой же способ формирования цвета, как в контроллере цвета Специалиста, только разрешение экрана остается 256х192 для совместимости со старыми играми:
Отдельное ОЗУ в видеокарте Метеор. В режиме COLOR2 в качестве порта цвета используется переменная attr. Режим экрана с линейной адресацией также похож на адресацию Специалиста. При увеличении младшего адреса с 0 до 191 экран заполняется вертикальными столбиками из горизонтальных байтов. Для перехода к следующему столбику надо увеличить адрес старшего байта.Цитата:
КОНТРОЛЛЕР ЦВЕТА ДЛЯ ПК "СПЕЦИАЛИСТ_МХ" В состав компьютера был введён контроллер цвета, допускающий 16 цветов на точку при разрешении 384 х 256 точек и имеющий своё собственное ОЗУ. Появилась возможность создавать "цветные" программы.
Основным отличием данной версии от предыдущих является наличие собственного порта цвета, реализованного на регистрах D1, D2. Это существенно облегчило программную поддержку контроллера цвета. Код цвета записанный в контроллер постоянно хранится в нём. При записи информации в экранную область памяти, код цвета из регистров порта параллельно записываются в ОЗУ цвета на элементах D3...D10. При отображении информации на экране монитора, одновременно с извлечением из видео ОЗУ байта посылки (8 горизонтальных точек), из ОЗУ цвета извлекается код цвета и фиксируется в регистре D12. Далее, при выводе битов полок видеоизображения на экран, код цвета записывается в регистры D13, D14.
Если бы Синклер не добавил в атрибут бит FLASH, то у нас тоже было бы по 16 цветов для PAPER и INK, как в Специалисте. Но видимо, не подумали об этом тогда. А сейчас уже ничего не изменить - игры написаны под стандартный байт атрибута. Но в Метеоре мы можем использовать режим COLOR2P, где PAPER и INK круче, чем в Специалисте, по 8 бит на цвет !
---------- Post added at 06:20 ---------- Previous post was at 06:00 ----------
После RESETа все цвета стандартные, используются аппаратные палитры для совместимости. Для устранения клешинга атрибутов палитры загружать не надо. Если в игре нужно использовать свою палитру - ее можно загрузить в загрузчике. Естественно все данные игры лежат на диске и их в начале игры загружают в ОЗУ, только палитры в ОЗУ видеокарты. Палитра не занимает ОЗУ компьютера - она в ОЗУ видеокарты Метеор.
---------- Post added at 06:25 ---------- Previous post was at 06:20 ----------
В Спектуме 15 цветов из 16 возможных. Два одинаковых цвета 0 и 8. Видеокарта при записи в память слоя цвет 0 преобразовывает в 8. То есть получаются цвета 1-15. На мониторе при этом все цвета останутся стандартными.
---------- Post added at 06:40 ---------- Previous post was at 06:25 ----------
В режиме COLOR2P видеокарта Метеор получает байт, который Z80 записывает в область пикселов экрана. Если бит 0, то в ОЗУ видекарты записывается байт цвета для 0 бита, если 1 - записывется байт цвета для 1 бита. Цвета берутся из палитры для рисования с номером в переменной pl2. Один байт для цвета бита 0, другой для цвета бита 1. Это позволит перекрашивать игры в момент рисования на экран в требуемые цвета. Можно использовать одну палитру, постоянно меняя два байта для выбора цвета или в загрузчике игры загрузить несколько палитр, а в игре выбирать номер соответствующей палитры.[COLOR="Silver"]
у Вектора еще была (есть) быстрая графика
http://emu80.org/dev/dev_v.html
в копилку идей, тс
схемотехнику при медленном проце
Спасибо, но в Векторе режимы не имеют особых преимуществ перед режимами Метеора:
Метеор не занимает основную память.Цитата:
В БПЭВМ "Вектор-06Ц" используется общая оперативная память для микропроцессора и контроллера графического дисплея объемом 64Кбайта. Объем экранного ОЗУ, при числе адресуемых точек изображения 256х256 и 16-и цветах, равен 32Кбайт.
В Метеоре 8 дополнительных слоев и у всех одинаковые адреса пикселей c 0000 или 4000.Цитата:
Для удобства описания экрана он делится на 4-е плоскости.
Таблица плоскостей экранного ОЗУ :
¦ Адресное ¦ Номер ¦
¦ пространство ¦ плоскости ¦
¦ E000-FFFF ¦ 0 ¦
¦ C000-DFFF ¦ 1 ¦
¦ A000-BFFF ¦ 2 ¦
¦ 8000-9FFF ¦ 3 ¦
В Метеоре также.Цитата:
Каждый байт плоскости соответствует сразу 8-и точкам, расположенным рядом на одной горизонтальной линии. Причем старший бит соответствует самой левой точке.
В Вектрое байты идут снизу-вверх. В Метеоре в линейном режиме L=0 - это верхний байт в столбике, L=191 - это нижний байт. Также как в Специалисте.Цитата:
Вся плоскость графического экрана состоит из 8-и точечных черточек. Самому младшему адресу "черточки" соответствует левая нижняя черточка. Следующая черточка расположена над ней и т.д. до самого верха (8000H-80FFH). Черточка с адресом 8100Н геометрически расположена правее черточки с адресом 8000Н. Адрес самой верхней правой черточки в этой плоскости - 9FFFH.
В Метеоре также - от 1 до 4 битов на точку.Цитата:
каждой геометрической точке экрана соответствует по одному биту в каждой из 4-х плоскостей. Эти четыре бита и определяют номер цвета 0-15
А вот над этим надо подумать. Как в Метеор на второй ступени расширения графических возможностей добавить аппаратный скроллинг.Цитата:
аппаратная поддержка вертикального сдвига отображаемой информации
256 точек по-горизонтали это 32 столбика байтов с номерами 0-31 в старшем байте. Чтобы создать иллюзию сдвига экрана надо задавать смещение от 0 до 7. При 0 - смещения нет.
Скроллинг влево.
При смещении 1 бит D7 в левом байте не виден, зато появляется бит D7 в байте из столбика 32. Перед сдвигом фона влево надо заполнить дополнительный столбец 32 тайлами фона.
Скроллинг вправо.
Также предварительно заполняем тайлами 32 дополнительный столбец экрана.
Давайте, думать как сдвигать и заполнять экран, если смещение больше 7.
Да и не надо двигать больше, чем на 8 пикселей за раз. Другое дело, что в расширенной адресации для дополнительного столбца место есть, а вот в стандартном режиме дополнительный столбец надо класть в атрибуты, пострадает графика стандартного слоя. Олсо сдвиги вверх и вниз тоже нужны. Предлагается двигать слои отдельно (например, завести байтовую переменную, включенные биты которой говорят какие слои сдвинутся следующей командой. Еще хочется циклический сдвиг - это позволит выделить слой под спрайт, вывести его один раз и двигать по экрану аппаратным скроллингом.
По-вертикали понятно тоже надо, там тоже есть запас 16 точек (при линейной адресации с адреса 0). Стандартный экран сдвигаться не будет. Если надо сдвиг подпрограмму рисования фона надо будет преобразовать в режим цвета COLOR2 и линейную адресацию.
Видеокарта будет сдвигать текущий слой. Надо графические переменные типа направление сдвига слоя shift_direct (LEFT, RIGHT, UP, DOWN), величину сдвига shift_value (1-8). Про циклический сдвиг не понятно. Может достаточно за 1 кадр сдвигать на 1-8 точек ?
Я как представлю каким образом придётся переделывать к примеру Soldier of Fortune то что то аж голова болеть начинает.
Весь блок отображения надо менять ПОЛНОСТЬЮ, он однозначно будет увеличен в размере, как минимум раза в 2-3, время выполнения соответствующее. Ко всем спрайтам придётся дорисовывать цветовую маску которая в 2-3 раза больше самого спрайта, принцип хранения спрайтов естественно надо будет менять, размер будет увеличен как минимум в 3 раза. Безостановочный рекодинг цветов из байтового представления в битовое убьёт процессор на первой же трети экрана.
Не совсем понятен в какой части карты здесь идёт разгрузка процессора? :)
---------- Post added at 11:53 ---------- Previous post was at 11:50 ----------
Кстати, мне уже кажется что сам программный код управляющий этой карточкой будет на несколько килобайт, может как нибудь подменяющееся пзу с программным кодом? а то пихать в каждую игру драйвер как то не айс
---------- Post added at 12:30 ---------- Previous post was at 11:53 ----------
Эммм, а если вдруг потом загорится увеличить возможное разрешение, то я что то не понимаю как это предусмотреть программно без переделки части отображения, формат хранения пикселей очень неудачен для разрешения больше 256, это моё мнение, не берите в голову :)
Если в игре нет масок у спрайтов - значит в ней нет и клешинга.
Нет никагого преобразования байтов в биты. Этим занимается карта. Процессор пишет байтами. Про причины ускорения и разгрузки процессора есть ссылка в 1 посту.Цитата:
Безостановочный рекодинг цветов из байтового представления в битовое убьёт процессор на первой же трети экрана.
Не совсем понятен в какой части карты здесь идёт разгрузка процессора? :)
Пзу убрать нельзя - оно нужно для старых игр. Да и что туда писать - какие драйвера ?Цитата:
Кстати, мне уже кажется что сам программный код управляющий этой карточкой будет на несколько килобайт, может как нибудь подменяющееся пзу с программным кодом? а то пихать в каждую игру драйвер как то не айс
Про линейную адресацию экрана есть ссылка в 1 посту.Цитата:
---------- Post added at 12:30 ---------- Previous post was at 11:53 ----------
Эммм, а если вдруг потом загорится увеличить возможное разрешение, то я что то не понимаю как это предусмотреть программно без переделки части отображения, формат хранения пикселей очень неудачен для разрешения больше 256, это моё мнение, не берите в голову :)
Непонятные для меня моменты:
Если карта успевает отображать только 5 слоёв с прозрачностью, то какой смысл в 8 слоях?
Что подразумевается под прозрачностью, просто отсутствие пикселя на данном плане и оставленный пиксель с предыдущего плана или же настоящая прозрачность - цвет пикселя на данном плане интерполированный с цветами пикселей предыдущих планов
при переделке игре надо оставлять стандартный вывод в 16384 и добавлять вывод цветов в пзу или полностью делать заново и всё выводить в пзу? если по 1 варианту так это явное увеличение выполнения, а если по 2-му то какой тогда смысл оставлять такую "неудобную" работу с пикселями если всё равно придётся всё перелопачивать
скроллинг экрана надо будет делать по принципу 15 летней давности аля денди? мож у кого посвежей идея есть? :)
---------- Post added at 14:03 ---------- Previous post was at 13:59 ----------
; hl - адрес символа
ld de, x * 256 + y * 8
dup 8
ldi
dec e
ldi
edup
я не понимаю как мне вывести спрайт в координаты x=243, y=179
На отключенных слоях, например, можно рисовать следующий кадр, а потом по INT их включить, а слои с предыдущим изображением выключить.
Пиксель не может отсутствовать на слое - он или прозрачный и через него будет видно изображение с нижних слоев при выводе на монитор или он цветной.Цитата:
Что подразумевается под прозрачностью, просто отсутствие пикселя на данном плане и оставленный пиксель с предыдущего плана или же настоящая прозрачность - цвет пикселя на данном плане интерполированный с цветами пикселей предыдущих планов
Сначала все выводится стандартно с адреса 16384 в слое 0. Потом, для устранения клешинга главного героя (ГГ), подпрограмму его вывода можно изменить для вывода в режиме COLOR2M в слой 1. Цвета спрайта в переменной attr те же, что были раньше.Цитата:
при переделке игре надо оставлять стандартный вывод в 16384 и добавлять вывод цветов в пзу или полностью делать заново и всё выводить в пзу? если по 1 варианту так это явное увеличение выполнения, а если по 2-му то какой тогда смысл оставлять такую "неудобную" работу с пикселями если всё равно придётся всё перелопачивать
Денди сделали в 1983 году, на год позже ZX Spectruma, то есть 32 года назад. Однако кое-что оттуда можно применить. У Спектрума нет аппаратного скроллинга. Почему бы не добавить ? Только у нас сдвиг будет задаваться на 1-8 точек. Это свежая идея ?Цитата:
скроллинг экрана надо будет делать по принципу 15 летней давности аля денди? мож у кого посвежей идея есть? :)
Пример копирования спрайта с маской для стандартного режима (40*8=320 такта):Цитата:
я не понимаю как мне вывести спрайт в координаты x=243, y=179
Пример копирования спрайта с маской для нового режима с линейной адресацией с адреса 0000 (36*8=288 тактов):Код:; hl - адрес спрайта с маской
; de - адрес в области пикселей экрана
dup 8
ld a,(de)
and (hl)
inc l
or (hl)
inc l
ld (de),a
inc d
edup
Пример копирования спрайта с маской для стандартного режима с использованием стека (36*8=288)Код:; hl - адрес спрайта с маской
; de - адрес в области пикселей экрана
dup 8
ldi
dec e
ldi
edup
Пример копирования спрайта с маской для нового режима с линейной адресацией с адреса 0000 с использованием стека (28*8=224 такта):Код:; стек - адрес спрайта с маской
; hl - адрес в области пикселей экрана
dup 8
pop de
ld a,(hl)
and e
or d
ld (hl),a
inc h
edup
Код:; стек - адрес спрайта с маской
; hl - адрес в области пикселей экрана
dup 8
pop de
ld (hl), e
ld (hl), d
inc l
edup
А можно выводить без буфера сразу на экран.
Исправил на более быстрый вариант для стандартного режима. Экономия 4 такта при рисовании каждых 8 точек. Не много, но все равно это быстрее, чем в стандартном режиме. Даже если бы и медленнее было бы - устраняется клешинг атрибутов, а это - резкое улучшение качества графики. Кроме этого, с такой же скоростью рисует и режим "4 цвета на точку". Это позволит немного разукрасить старые игры, а в новых рисовать тайлы и спрайты более объемными или разноцветными.Цитата:
экономия в 4 такта без стека (вот не надо принудительно тормозить вывод) и 8 со стеком не столь существенна.
xor то был не от хорошей жизни. можно ничего и не менять - тогда все останется по-старому. А можно поменять и получится лучшая графика.Цитата:
все игры с xor идут мгновенно лесом (казалось бы причем тут dizzy), ну или требуют также серьезной переделки
В линейном режиме линии точками рисовать проще и быстрееЦитата:
попиксельные выводилки немного посложнее
Можно и без дма обойтись. Даем команду сдвинуть фон на точку - карта просто добавит смещение при отображении данного слоя без копирования.Цитата:
аппаратный скролл сдвигом битов в памяти просто убил, то есть дма делаем но только для сдвига или как это должно работать, я не совсем понял
Бог с ним, с задним планом, в обычном режиме он заодно и экран стирает, так а как мне вывести того же самого колобка который двигается с точностью 1 пиксель во все стороны? делать 2 буфера (пиксельный и масочный) на 8 пикселей больше по X и в нём уже сдвигать всё это по пикселям в зависимости от того куда мне надо сдвинуть? а если у меня 64 одинаково выглядящих объекта на экране которые динамично двигаются по экрану с точностью 1 пиксель? делать 64 буфера и в них двигать? или делать по 8 вариантов самого спрайта вместе с цветовой маской?
как бы всё таки проц не помер на первой же трети экрана
---------- Post added at 21:41 ---------- Previous post was at 21:39 ----------
И кстати, видео DMA в состоянии всего из 1 обычного экрана сделать хоть 16 планов, причём с наложением, стоит ли овчинка выделки?
Неспособность Z80 нарисовать колобка и необходимость для этого блиттера сильно преувеличена. До этого спрайты в играх рисовали без блиттера. Шарики есть во многих играх.
Реализация 1 этапа расширения графики в эмуляторе и видеокарте "Meteor Graphics" позволит устранить клешинг и ускорить построение изображений в играх следующих типов:
Цветные ходилки типа "Three Weeks in Paradise"
http://www.youtube.com
Ходилки с несколькими планами фона типа "SABOTEUR 2"
http://www.youtube.com
Игры с проволочной графикой типа "ELITE"
http://www.youtube.com
Реализация 2 этапа расширения графики в эмуляторе и видеокарте "Meteor Graphics" позволит ускорить построение изображений в играх со скроллингом фона:
"R-TYPE"
http://www.youtube.com
"SILKWORM"
http://www.youtube.com
"SABOTAGE"
http://www.youtube.com
"Flying Shark"
http://www.youtube.com
Посмотрите на игры для Денди. Не так уж много там спрайтов. Неужели Z80 не успеет их нарисовать ?
"Darkwing Duck Черный Плащ"
http://www.youtube.com
"Jackal"
http://www.youtube.com
Конечно можно пытаться вывести огромное количество спрайтов на экран и перегрузить процессор. Но можно ведь выбрать разумное их количество !
А на сколько процентов работа уже выполнена в железе?
И на каком чипе будет?
А кто программно ваять будет? :)
---------- Post added at 22:53 ---------- Previous post was at 22:17 ----------
Как подключаться будет, мгтф или разъём чей нибудь?
Прошивку для FPGA буду сам разрабатывать и кодировать. И форум поможет.
Видеокарта "Meteor Graphics" будет разрабатываться в виде контроллера для шины ZX-BUS.Цитата:
Как подключаться будет, мгтф или разъём чей нибудь?
Скроллинг по-горизонтали.
Экран шириной 256 точек - это 32 столбика байтов с номерами от 0 до 31. Чтобы сдвинуть экран влево надо заполнить тайлами еще один столбик с номером 32. А чтобы через 8 сдвигов на 1 точку продолжилось изображение надо за это время заполнить тайлами еще и столбик с номером 33. Как прошел сдвиг, кратный байту номера, номера и адреса столбиков соответственно меняются. То есть номера столбиков у нас опять будут 0-31, но экран сдвинулся на 1 байт влево.
Для сдвига экрана влево надо предварительно заполнять тайлами столбики с номерами 40 и 41.
Мда, взялся было прочитать всё, что накопилось за время моего отсутствия в теме, дошёл до замены блиттера слоями... и бросил нафиг :v2_dizzy_facepalm:
Если так быстро, то и ZXПирит окажется ненужной! :)
Я планирую её старт не раньше апреля 2016, а скорее всего позже.
Но я всё равно буду её вести. Пусть будет космонавтом-дублёром, так и не взлетевшим.
---------- Post added at 06:53 ---------- Previous post was at 06:51 ----------
И возможно намного позже. Из-за эффекта непредвиденного.
есть идея ребрендинга, идеальное название Лифт-2013, так как этот девайс позволяет чуть быстрее передвигаться и при желании его можно догнать.
---------- Post added at 14:04 ---------- Previous post was at 13:33 ----------
И еще, с выбором чипа, EP2C5
Есть уверенность что все влезет в этот чип?
Насколько я помню, вместо EP2C5 уже не поставить EP2C8 и выше, там есть небольшие расхождения пинах
А какой лучше чип использовать что бы на будущее? :)
Новые режимы в дополнительных слоях 1-8 нужно делать сразу для линейной адресации экрана с адреса 0000.
Для упрощения прошивки FPGA и ускорения работы в схему видеокарты "Meteor Graphics" добавлен 1 MB статики. Теперь ее надо распределить.
50 раз в секунду стандартный экран и дополнительные слои с расширенной графикой накладываются с учетом прозрачного цвета и палитр. Результирующее изображение записывается в буфер экрана в формате 2 байта на точку. Для буфера экрана нужна память размером 256*256*2=128KB.
Первый этап расширения графики.
Разрешение экрана 256*192 точки.
Один слой будет занимать 256*256=64KB.
128KB: буфер экрана + стандартный экран 6912
7*128KB: 14 слоев по 64KB без аппаратного скроллинга
Второй этап расширения графики
Разрешение экрана 256*192 точки + аппаратный скроллинг.
Один слой будет занимать 512*256=128KB.
128KB: буфер экрана + стандартный экран 6912
7*128KB: 7 слоев по 128KB с аппаратным скроллингом
Третий этап расширения графики
Можно будет подумать о разрешении экрана 320*240 точек и блиттере.
Один слой будет занимать 512*256=128KB. Тайлы и спрайты разместить в SDRAM.
2*128KB: буфер экрана + стандартный экран 6912
6*128KB: 6 слоев по 128KB с аппаратным скроллингом
Первоначально планировалось сделать 8 дополнительных слоев. Предыдущие расчеты показывают, что для разрешения 256*192 с возможностью аппаратного скроллинга - памяти хватает на 7 слоев, а для разрешения 320*240 - на 6 слоев.
Применение статической памяти позволит отображать сразу 7 слоев одновременно. Также статика упрощает реализацию аппаратного скроллинга и блиттера с точностью до точки.
Таблица размещения в статической памяти размером 1 MB буфера экрана, двух стандартных экранов 6912 (для 128K) и 7 слоев для расширенной графики
http://s016.radikal.ru/i334/1509/94/8675e8d9ee7dt.jpg
Эта информация нужна для проектирования прошивки FGPA. В таблице показано расположение памяти со стороны FPGA. Вся память делится на 8 страниц по 128 KB с номерами от 0 до 7. Номер слоя 1-7 соответствует номеру страницы. Z80 к этим областям доступа не имеет. Байты, которые он записывает в дополнительные слои, преобразовываются в цвета 8 точек и FPGA записывает эти 8 байтов в нужную область SRAM.
Картинку надо будет немного подкорректировать:
Так как в режиме 128K у нас 2 экрана, то второй экран надо разместить снизу в 7 странице.
Для разрешения 256*192 весь буфер экрана уместится в 0 странице. В 7 странице можно разместить 7 слой.
а 4 бита на точку хватит?
а сколько цветов будет?
Видеокарта сможет показывать 32768 цветов - 32 оттенка серого:
http://s003.radikal.ru/i202/1509/e0/bc17139cece0t.jpg
На первом этапе будет устранен клешинг атрибутов. Цвета останутся стандартными.
На втором этапе добавится палитра в каждом слое и аппаратный скроллинг.
На третьем добавится блиттер с 8 битами на точку.
Программно больше 4 битов на точку наверно не имеет смысла гонять.
Распределение статической памяти внутри видеокарты "Meteor Graphics".
http://i003.radikal.ru/1509/d6/3d3c9fe33294t.jpg
а если атрибут меняется или мерцание флеша? Это уже 64 байта, что бы успеть, без останова процессора, SRAM должна работать на 3,5/3*64 = 74мгц + если читать хотя бы с частотой 7мгц 6 слоев это еще 42МГц, итого нужна SRAM как минимум 9нс а это SSRAM с очень высокой стоимостью
---------- Post added at 20:48 ---------- Previous post was at 20:48 ----------
Или я что то не понял по нагрузке на шину?
Исправил. В стандартном режиме (в слое 0) все хранится по-старому. Отдельно байт пикселов и байт атрибутов.
В дополнительных слоях нет атрибутов и флеша. Там только 8 байтов на 8 точек.
Должно хватить. 4 бита на точку - это 16 цветов на спрайт из 256 цветов в слое из 32768 цветов !
В большинстве случаев хватит и 2 бита на точку - это 4 цвета на спрайт из 256 цветов в слое из 32768 цветов.
При рисовании используется палитра для рисования. А в каждом слое палитра отображения.
http://s019.radikal.ru/i639/1506/36/f2bf9b657467t.jpg
Палитра как у MSX2+ 32K цветов при 15-битном RGB 5+5+5
да да вот я и хотел уточнить сколько бит на цвета закладываешь
15 бит... наверное нормально.
Давайте уточним полярность байтов и масок.
Маска содержит 0 - там, где цвета спрайта и 1 - там, где прозрачный цвет ?
При использовании XOR спрайт не содержит маски. 1 - там, где цвет спрайта и 0 - там, где прозрачный ?
Можем мы вывести спрайт без маски в режиме COLOR1C ?
COLOR1C - 1 цвет на 8 точек + прозрачный
По соответствующему адресу в области пикселей нужно записать байт данных. На каждую из восьми точек приходится по 1 биту: 0 - прозрачный, 1 - цветной. Номер цвета предварительно записывается в переменную color. 0 - прозрачный, 1-255 выбранный цвет. Данный режим предназначен для наложения одноцветного изображения поверх существующего. Например, для вывода текста, рисования линии по точкам, а также для стирания тайла/спрайта с текущего слоя, если color = 0.
Зачем в цветах на каждую точку использовать XOR ?
Мне уже страшно становиться какого размера будет драйвер управления.
Пример подпрограммы рисования спрайта с маской в режиме COLOR2M размером 24х24 точки по координатам, заданным в знакоместах. Спрайт в памяти хранится так: байт маски 1 линии в столбике, байт данных 1 линии в столбике, байт маски 2 линии в столбике, байт данных 2 линии в столбике, ... байт маски 24 линии в столбике, байт данных 24 линии в столбике. Затем аналогично записан второй и третий столбики спрайта.
Код:; перед выводом спрайтов устанавливаетя режим цвета color_mode = COLOR2M
; и выбирается номер слоя current_layer для рисования
;
; hl - адрес спрайта
; d - координата x в знакоместах
; e - координата y в знакоместах
; a - цвет спрайта, соответствует стандартному атрибуту Спектрума
ld (attr), a ; устанавливаем цвет спрайта
sla e ; вычисляем адрес младшего байта e в области пикселов
sla e ; старший байт d соответствует координете x
sla e
push de ; сохраняем координаты начала столбика
dup 24 ; рисуем 1 столбик спрайта высотой 24 байта
ldi
dec e
ldi
edup
pop de ; восстанавливаем координаты начала столбика
inc d ; переходим к столбику справа
push de ; сохраняем координаты начала столбика
dup 24 ; рисуем 2 столбик спрайта высотой 24 байта
ldi
dec e
ldi
edup
pop de ; восстанавливаем координаты начала столбика
inc d ; переходим к столбику справа
dup 24 ; рисуем 3 столбик спрайта высотой 24 байта
ldi
dec e
ldi
edup
ret
Пример подпрограммы рисования спрайта без маски в режиме COLOR1C размером 24х24 точки по координатам, заданным в знакоместах. Спрайт в памяти хранится так: байт данных 1 линии в столбике, байт данных 2 линии в столбике, ... байт данных 24 линии в столбике. Затем аналогично записан второй и третий столбики спрайта.
Код:; перед выводом спрайтов устанавливаетя режим цвета color_mode = COLOR1C
; и выбирается номер слоя current_layer для рисования
;
; hl - адрес спрайта
; d - координата x в знакоместах
; e - координата y в знакоместах
; a - цвет спрайта от 1 до 15
ld (color), a ; устанавливаем цвет спрайта
sla e ; вычисляем адрес младшего байта e в области пикселов
sla e ; старший байт d соответствует координете x
sla e
push de ; сохраняем координаты начала столбика
dup 24 ; рисуем 1 столбик спрайта высотой 24 байта
ldi
edup
pop de ; восстанавливаем координаты начала столбика
inc d ; переходим к столбику справа
push de ; сохраняем координаты начала столбика
dup 24 ; рисуем 2 столбик спрайта высотой 24 байта
ldi
edup
pop de ; восстанавливаем координаты начала столбика
inc d ; переходим к столбику справа
dup 24 ; рисуем 3 столбик спрайта высотой 24 байта
ldi
edup
ret
Пример подпрограммы стирания спрайта размером 24х24 точки по координатам, заданным в знакоместах.
Код:; перед стиранием спрайтов устанавливаетя режим цвета color_mode = COLOR1C,
; цвет для стирания color = 0 и выбирается номер слоя current_layer для стирания
;
; d - координата x в знакоместах
; e - координата y в знакоместах
sla e ; вычисляем адрес младшего байта e в области пикселов
sla e ; старший байт d соответствует координете x
sla e
ld a, #FF; байт для стирания - стираем все 8 точек в байте
dup 24 ; стираем 1 столбик спрайта высотой 24 байта сверху-вниз
ld (de),a
inc e
edup
inc d ; переходим к столбику справа
dup 24 ; стираем 2 столбик спрайта высотой 24 байта снизу-вверх
dec e
ld (de),a
edup
inc d ; переходим к столбику справа
dup 24 ; стираем 3 столбик спрайта высотой 24 байта сверху-вниз
ld (de),a
inc e
edup
ret
Надо бы к моменту изготовления видеокарты или доработки эмулятора сделать демы для некоторых режимов. Есть у кого идеи?
Я прикинул, что в режиме COLOR2 можно делать программный скроллинг экрана в цвете для окна 160х160 точек. Еще бы в верхнем слое добавить самолет или вертолет, летящий вверх типа FLAYING SHARK.
Или Ded Moroz Demo. Идет объект в режиме ZX COLOR в виде контура. Потом переходит в зону СOLOR1C. Тут он уже однотонный, но сквозь глаза виден фон. Потом в зоне COLOR2M глаза уже нормальные - черные. В зоне COLOR4 шуба уже красная. лицо желтое, а елка зеленая.
Вообще, раз демонстрируем возможности видеокарты надо делать дему с визуальными эффектами.
Сколько тактов получилось на спрайт 24х24 ?
И по мне так это всё таки странное решение выводить по знакоместам
---------- Post added at 10:28 ---------- Previous post was at 10:22 ----------
Так будет ускорение вывода или уменьшение выводимой информации?
Эти случаи двойного наложения настолько редкие (очень редкие) что делать из-за этого аппаратные слои нет никакого смысла, у меня создаются стойкие ощущения что для всего этого потребуется процессор > 30 МГц
---------- Post added at 10:46 ---------- Previous post was at 10:28 ----------
Кстати скроллинг экрана не всегда бывает кратный 1-му пикселю, он может быть и 2 и 3 и 9 и 27, что делать в таком случае? полностью перерисовывать фон?
---------- Post added at 10:55 ---------- Previous post was at 10:46 ----------
http://www.gamedev.ru/code/articles/?id=4208
Не надо столько режимов.
Режим 1 – цвет 1 байт на 8х1 пикселей;
Режим 2 – цвет 2 байт на 8х1 пикселей;
Режим 3 – цвет 3 байт на 8х1 пикселей;
Режим 4 – цвет 4 байт на 8х1 пикселей.
Во всех режимах доступна палитра 16/256. Всего 16 палитр, по умолчанию палитра 0. По умолчанию представляет стандартные цвета. Любой цвет любой палитры может быть объявлен прозрачным. Смена палитры, переопределение цвета в палитре и объявление цвета прозрачным производятся через вызов соответствующих функций. С одинаковыми номерами во всех трёх режимах.
Программы, которые не знают об этих функциях и не знают их номеров, всё равно не смогут их вызвать. А конструкция «видеочипа» будет проще. Номера режимов прямо указывают на количество битов на пиксель (байтов на тайл 8х1).
Во всех режимах по умолчанию атрибут на знакоместо. Но можно установить флаг атрибут на строку знакоместа. Атрибут из расчёта байт на битплан слоя, хранит номера цветов 16-цветной палитры. В качестве атрибута всего знакоместа используется атрибут его 0 строки. Дополнительный параметр устанавливает возможность использовать бит 7 битплана 0 как бит мерцания, в этом случае для фона битплана 0 доступны только цвета 0-7 текущей палитры. По умолчанию (после сброса) параметр установлен.
Во всех режимах возможна установка разрешения 256х192 или 320х200. Разрешение 320х240 (QVGA) не нужно, оно использовалось только на мобилках и карманных медиалеерах с середины «нулевых», но под него не было каких-то эксклюзивных удачных игр, портировать с него нечего. А в 320х200 много старых игр (на PC, например). Зато, возможно, стоит рассмотреть вариант 320х180 – он будет без чёрных полосок подгоняться под современные мониторы 16:9. По умолчанию (после сброса) разрешение 256х192.
По умолчанию во всех режимах экран располагается с адреса 8000h, при необходимости адрес может быть переключён на 0000h.
Такая архитектура в силу своей ортогональности максимально упрощает разработку и отладку видеокарты, а также интуитивно понятна программисту.
Расход памяти в байтах на каждый слой: 2 х номер_режима х разрешение_режима. Округлённо: 64 КБ на экран 320х200 в режиме 4. На 8 слоёв необходимо 512 КБ памяти.
Рендеринг изображения производится в буфер (ramdac), всего есть 2 буфера, которые переключаются по кругу (двойная буферизация). Переключение буферов производится специальным вызовом вручную. При 8 слоях в режиме 4 у нас будет максимум 128 цветов на точку, округляем до байта и получаем 128 кб двухпортовую память (два буфера 320х200х256). При переключении буфера текущая палитра дублируется в теневую копию, которая затем используется при выдаче содержимого буфера на экран. Т. е. на экране отображается одна 256-цветная палитра, а мы работаем в видеопамяти с другой.
P.S. Номер режима 0 может быть использован (зарезервирован) для текстового режима видеокарты (пригодится для системных и офисных программ).
P.S.2. Не понимаю какая разница с какого адреса у нас видеопамять: с 0000 или 8000, всё равно банками щёлкать. Хотя как бы процессору и незачем лезть непосредственно в память спрайтовой видеокарты (а Метеор хоть и несколько оригинальная, но таки спрайтовая видеокарта). А вот источником головной боли для программиста/хакера-адаптатора отображение видеопамяти поверх системного ПЗУ вполне может стать. Ведь игра вполне может вызывать отдельные функции оттуда. Или использовать системный шрифт.
Sameone, а ты прочитал всю тему прежде, чем вносить предложения? Перечитай, пожалуйста, и ответь сам себе на вопрос о нужности в этой теме идей о том, как сделать принципиально другую видеокарту. Надоело по 10-му разу это объяснять очередному прочитавшему первый и десяток последних постов.
Олсо ты даже не понял что за идея тут предлагается.