Разработка схемы видео-адаптера для ZX-Spectrum
|
|
Hazar | Дата: Пятница, 31.07.2015, 03:20 | Сообщение # 61 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
|
Менеджер памяти
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Суббота, 01.08.2015, 02:13 |
|
| |
Hazar | Дата: Вторник, 04.08.2015, 03:04 | Сообщение # 62 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
|
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Вторник, 04.08.2015, 03:07 |
|
| |
Hazar | Дата: Среда, 05.08.2015, 03:07 | Сообщение # 63 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Формирователь атрибутов для стандартного режима с увеличенным “цветовым разрешением” атрибута ( 8*8 точек) при режиме развертки 1024*768 .
Предлагаемая схема раскладки атрибутов позволяет также расширить количество Отображаемых цветов до (6 bit) на каждый цвет, но требуется использование Параллельного включения 3 микросхем памяти ( K6R4008V1D) или 2 (K6R4016V1D). При сохранении предлагаемой раскладки адресного пространства атрибутов. При использовании одной микросхемы С 8 битной организации удается получить только стандартное количество цветов 2 бита на каждый цвет (включая цвет paper). В схеме видео-адаптера предполагается использовать независимые счетчики для Формирователя атрибутов что дает некоторые преимущества (по сравнению со схемами где формирование адресного пространства пикселов и атрибутов совместное). Одним из таких преимуществ является произвольное изменение размера или координат выводимого атрибута, а также получение смешанных атрибутов с других независимых источников.
Spectrum жив в нашей душе навсегда
|
|
| |
Hazar | Дата: Понедельник, 21.12.2015, 15:07 | Сообщение # 64 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Реализация декодера для портовых расширений. (с использованием индивидуального слота для видеоадаптера) Принцип работы -декодер на логике производит предварительную выборку И дешифрацию диапазона адресов 16384-23296 (адресной шины процессора Z80) ,После чего полученный сигнал выборки объединяется по логике ИЛИ (OR) С сигналом IORQ процессора ,Полученный сигнал Arb_iorq1 Заводится отдельной линией на слот видеоадаптера, устройство позволяет использовать любой номер порта в диапазоне 16384 - 23296 без конфликтов со стандартными портами Speccy. При условии использования в компьютере арбитра портов рассмотренном в теме zx.clan.su/forum/7-150-1
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Понедельник, 21.12.2015, 15:11 |
|
| |
Hazar | Дата: Понедельник, 21.12.2015, 15:37 | Сообщение # 65 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Обновление схемы видеоконтроллера (1024*768 ~60 Hz XGA)
Устройство предназначено для генерации сигналов синхронизации мониторов и формирователем адресного пространства экрана. Схема формирует строчный синхронизирующий импульс (ССИ),строчный гасящий (СГИ), Кадровый синхронизирующий импульс (КСИ), кадровый гасящий(КГИ) а также Импульсы горизонтального Border .
Схема использует 2 внешние задающие частоты ~4 mHZ ~8 mHZ заведенных на тактовые Входа счетчиков, для некоторых мониторов может потребоваться дополнительно подбор Внешних частот (4, 8mHz) для формирования правильного отношения сторон (4 - 3) .
Набор элементов Quartus
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Понедельник, 21.12.2015, 16:27 |
|
| |
Hazar | Дата: Воскресенье, 06.11.2016, 22:10 | Сообщение # 66 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Проблема смешивания цвета INK , PAPER и BORDER. Обычно в стандартных схемах атрибутного вывода в спектрумах применяли Мультиплексоры кп11 или кп12,14 при этом вывод цвета чернил и бумаги разделялся во времени (в каждый момент времени выводился либо цвет чернил либо бумаги) . В качестве управляющего сигнала для мультиплексоров служил пиксельный видео-поток , сформированный сдвиговым регистром при наличии логической «1» в видео-потоке отображался цвет INK а при «0» цвет PAPER . Данное решение удобно использовать при небольшом количестве цветов , при расширении количества цветов (256 индексный код ) требуются довольно сложные ключевые схемы с не менее сложной предварительной дешифрацией (выборкой каналов) . Тем не менее существует более простое решение за счет применения аналогового мультиплексора который работает с малыми уровнями сигналов (0,7 ….2 в) и имеет согласованный выход для подключения непосредственно к мониторам.
Spectrum жив в нашей душе навсегда
|
|
| |
Black_Cat | Дата: Воскресенье, 06.11.2016, 22:37 | Сообщение # 67 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| Ну, насамделе, обычно всёж коммутируют мультиплексорами цифру, которая затем уже поступает на ЦАПы :)
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Понедельник, 07.11.2016, 19:18 | Сообщение # 68 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Преобразования индексного цвета
можно конечно и цифру с коммутировать если средства позволяют , только вот как коммутировать к примеру 65536 color ?
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Понедельник, 07.11.2016, 19:27 |
|
| |
Black_Cat | Дата: Вторник, 08.11.2016, 13:41 | Сообщение # 69 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| 65536 color это RGB 565, т.е. два ЦАПа с 5 разрядной мультиплексируемой шиной и один с шестиразрядной. При этом Спековский IRGB представляется в виде пяти, или шестиразрядного фиксированного кода. Цифровое мультиплексирование обычно применяется в ПЛИС.
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Вторник, 08.11.2016, 15:42 | Сообщение # 70 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Что то по моему о разных вещах говорим, 65536 color в цифровом представлении это 16 линий (2 байта), допустим 16 бит это цвет INK но еще есть PAPER (допустим сделаем 8 бит для него), что еще есть атрибут яркости и бордер (8 цветов) всю эту кучу надо смешивать обязательно в цифровом виде?
Аналоговые микросхемы ничуть не хуже PLIS в некоторых случаях даже лучше (по быстродействию ничуть не уступают цифровым микросхемам). К тому-же не будете же вы PLIS напрямую к монитору цеплять , все равно на выход ставят или транзисторы или какие-нибудь буферные микросхемы с большой нагрузочной способностью. ************************************************************************************** Перекодирование цветов INK до 64 цветов (для стандартного режима) с помощью битов "PAPER"
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Среда, 09.11.2016, 23:34 |
|
| |
Black_Cat | Дата: Вторник, 08.11.2016, 15:54 | Сообщение # 71 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| Два байта делишь на три цвета, получаешь 5+6+5 для 64к цветов.
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Среда, 09.11.2016, 03:08 | Сообщение # 72 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Сделал индекс всего цветового спектра на 256 цветов с двумя уровнями яркости , визуально видно что 256 цветов не хватает . Если же разбить всю палитру На 2 или лучше 3 фрагмента то смотрится еще более менее, а 655536 цветов Результат должен быть еще лучше притом палитру похоже можно сделать фиксированной. Сделать такой хитрый цветовой дешифратор с индексным представлением , тогда отпадает необходимость хранить в памяти адаптера пикселы и атрибуты отдельно так как цветовой индекс уже содержит все цвета.
2 в 16 степени это не то же самое что (B 2^5)+(G 2^5)+(R 2^6)= 128 цветов Так получается из-за того что цвета изолированы друг от друга, цифровые мультиплексоры не смешивают амплитуды сигналов, а при аналоговом Смешивании как раз бы получилось 65536 ,но есть и недостаток основные цвета влияют друг на друга !
может я конечно и не прав но монитор не отображает весь спектр цветов. из за близкого расположения пикселов основные цвета смешиваются в разных пропорциях
декодер индексного цвета на vhdl , как работает не проверял до паяльника руки пока не доходят
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Среда, 09.11.2016, 23:38 |
|
| |
Hazar | Дата: Пятница, 11.11.2016, 01:53 | Сообщение # 73 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Формирователь сигнала Flash Схема разработана в связи с изменением в проекте метода вывода Атрибутов и пикселов, в совмещенный формат (ATR+PIXELS) с индексной Кодировкой цвета.
исследования смесителей на мультиплексорах
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Пятница, 11.11.2016, 13:27 |
|
| |
Black_Cat | Дата: Воскресенье, 13.11.2016, 01:48 | Сообщение # 74 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| Цитата Hazar ( ) 2 в 16 степени это не то же самое что (B 2^5)+(G 2^5)+(R 2^6)= 128 цветов
:) и с какого перепою ты их плюсуешь? :)
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Понедельник, 14.11.2016, 03:40 | Сообщение # 75 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Цитата Black_Cat ( ) и с какого перепою ты их плюсуешь? :)
Да без бутылки не разобраться (интуиция против разума) Цвета конечно смешиваются (умножаются) если все 16 бит одномоментно Присутствуют и подаются на ЦАП , но мультиплексоры коммутируют цвета во Времени так что количество разрядов уменьшается вдвое.
Spectrum жив в нашей душе навсегда
|
|
| |
Black_Cat | Дата: Понедельник, 14.11.2016, 13:57 | Сообщение # 76 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| Мультиплексоры коммутируют токо видеопотоки: бордюр/экран, стандартный экран 16 color/расширенный экран 64k color (если ты его хочешь). Нет никакого уменьшения разрядности, ты путаешься.
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Понедельник, 14.11.2016, 22:02 | Сообщение # 77 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| PAPER / INK Коммутируют
Знакогенератор часть 2
Символьная Графика пользователя (UDG) .
В верхних областях памяти компьютера, начиная с адреса 65368 и по адрес 65535 находится область UDG-графики (графики пользователя). Она занимает 168 байт, каждый символ занимает 8 байтов, таким образом можно задать только 21 символ.
На клавиатуре компьютера эти символы "привязаны" к клавишам от A до U в алфавитном порядке и выдаются на экран когда компьютер находится в графическом режиме, Этот режим обычно применяют когда нужно печатать на экране не стандартные символы или используют для добавления национальных шрифтов.
Обращение процессора к этой области можно интерпретировать с некоторыми оговорками как символьный режим для печати текста на экране.
И соответственно сформировать управляющий сигнал для манипуляций С символьными данными с которыми в текущий момент времени работает процессор.
Нестандартные наборы и расширенные графические режимы.
Графический режим - 512x192 применялся на не которых клонах ZX для печати ,большего количества символов в строке ( 85) при этом использовали символы с нестандартным размером 6x8 точек
Для идентификации этого режима можно использовать сервисный ROM с загруженным шрифтом пользователя, таким образом при текущей печати символа блок знакогенератора сможет произвести сравнение данных (содержимого памяти ZX Spectrum с данными расположенными в ROM (6x8) x XX. )
Для хранения символьных данных проще всего использовать “виртуальный ROM” Который физически расположен в FPGA (напр. м.с. EP2C8Q208C7).
Код шаблон на VHDL для описания ROM ***************************************************** library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
entity ROM is
port ( cl : in std_logic; rd : in std_logic; address : in std_logic_vector(6 downto 0); data_out: out std_logic_vector(15 downto 0));
end ROM;
architecture behav of ROM is type ROM_array is array (0 to 95) of std_logic_vector(15 downto 0);
constant content: ROM_array := (
0 => "0000000000000000", -- данные символов 16x16 1 => "0000111111000000", 2 => "0000000011100000", ----------------------------------------------------- 13 => "0000000000001101", 14 => "0000000000001110", 1535 => "0000000000001111",
others => "0000000000000000");
begin process(cl, rd) begin
if(cl = '1' ) then elsif (cl'event and cl = '1') then
if rd = '1' then -- данные идут по фронту
data_out <= content(to_integer (unsigned (address))); else data_out <= "0000000000000000";
end if; end if; end process; end behav; *********************************************************************
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Понедельник, 14.11.2016, 22:05 |
|
| |
Hazar | Дата: Понедельник, 14.11.2016, 23:19 | Сообщение # 78 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Наборы шрифтов и псевдографики различных размеров для прошивок. 8x8. 8x16. 16x16. 16x24. 24x32. 32x32. (character set ,roms HEX format)
Spectrum жив в нашей душе навсегда
|
|
| |
Hazar | Дата: Среда, 16.11.2016, 22:04 | Сообщение # 79 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Знакогенератор часть 3 Делаем прошивку из графических файлов. В части№2 я выложил пример кода на VHDL для описания ROM который несмотряна своюПростоту все же имеет недостаток а именно двоичное представление данных для описываемых символов, что при большом объеме ROM становится слишком долго набирать весь набор символов (а у нас их 96 ) . Существуете ще другой вариант воспользоваться встроенным в Quartus2 мастером “MegaWizard”Который может создать компонент ROM самостоятельно. Проблема вся в том где взять HEX файл в формате intel, требуемый для загрузки в ROM. Если в распоряжении разработчика есть Только графические файлы символов требуемых размеров 16x16 16x24 24x32 и.др. Для работы с файлами символов понадобится универсальный конвертор например (winhex) С помощью этой программы можно работать как с текстовыми форматами(ASC) так и с бинарными включая HEX формат . Редактировать же сами символы можно в любом графическом редакторе например на ZX Spectrum можно использовать программу “DoubleFont Editor” которая позволяет редактировать символы 16x16 точек. Полученные графические файлы нужно сконвертировать в формат WBM (в негативном цвете) этот формат сохраняет графику в бинарном виде(HEX)и ничег окроме своего заголовка размером в 4 байта и данных графики не содержит. Далее с помощью Winhex можно вырезать ( меню прог.команда cut) ненужные заголовки . Полученные таким образом файлы нужно соединить в один, что можно сделать в файловом менеджере,и наконец сконвертировать объединенный файл программой “winhex” в формат Intel hex. Теперь можно использовать полученный файл в проекте Quartus 2.
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Среда, 16.11.2016, 22:07 |
|
| |
Hazar | Дата: Понедельник, 21.11.2016, 22:26 | Сообщение # 80 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Метод разделения переднего и заднего планов а также устранения “клэшинга” С помощью отслеживания кодов команд CALL .
Для начала я подобрал рабочий пример процедуры на ассемблере, из разбора которого И появилась эта новая идея Пример из книги как написать игру для ZX Spectrum:
На рис. показана часть игрового пространства, состоящего из протяженного пейзажа и микроавтобуса, проезжающего мимо домов. На переднем плане мелькают дорожные фонари. Выехав за пределы города, автомобиль останавливается на пару секунд, а затем начинает свое движение с исходной точки трассы. Просмотрев этот мультфильм несколько раз, вы обнаружите, что дома появляются не каким-то случайным образом, а занимают строго определенное положение на пути следования автомобиля. То есть в программе создается вполне конкретный пейзаж и каждый момент времени на экране виден только небольшой его фрагмент.
Рис Вывод изображения из дополнительного экрана. Поясним, как это достигается. В блоке данных, описывающих пейзаж (в программе он обозначен меткой D_LAND), указывается положение каждого дома (или другого объекта) на трассе, протяженность дома, его «удаленность» от дороги и адрес другого блока, задающего его внешний вид. Программа просматривает данные пейзажа и, исходя из положения автомобиля (он всегда выводится в центре окна), выбирает только те дома, которые целиком или частично попадают в окно экрана, то есть если правый угол дома не выходит за левую границу и левый - за правую, а остальные пропускает. После этого начинается вывод объектов в дополнительный экран: сначала дома, затем рисуется дальний тротуар, автомобиль, ближний тротуар и, наконец, фонари. Как только построение закончено, окно дополнительного экрана переносится в физический видеобуфер и тем самым изображение становится видимым. Так как объем памяти ограничен, в программе заданы только два типа зданий, а протяженность пейзажа измеряется в 200 знакомест. Процедура ПЗУ, находящаяся по адресу 8020, служит для проверки нажатия клавиши Break (Caps Shift/Space). Подпрограмма не требует никаких входных параметров и сообщает о том, что Break нажата установкой на выходе флага переноса. В противном случае выполняется условие NC.
ORG 60000 ; Адрес ( виртуального) экрана = #8000
V_OFFS EQU #40 ;старший байт смещения адреса ; «виртуального» экрана относительно начального адреса физического экрана
LD A,69 LD (23693),A XOR A CALL 8859 CALL 3435 LD A,2 CALL 5633 ;здесь необходима только для правильного вывода атрибутов основного экрана
MAIN LD A,2 ; Инициализация переменных LD (X_LAMP),A LD HL,0 LD (X_LAND),HL CALL FRAME ;рамка вокруг окна MAIN1 CALL CLS_V ;очистка « виртуального » экрана
Формирование игрового поля в «виртуального» экране
CALL LAND ;вывод заднего плана (дома) CALL LINE1 ;рисование дальнего тротуара CALL PUTCAR ;автомобиль CALL LINE2 ;ближний тротуар CALL LAMPS ;фонари ------------------------------------- CALL PUTVRT ;вывод окна виртуального экрана на физический
CALL 8020 ;проверка нажатия клавиши Break RET NC ;выход из программы, если нажата LD HL,(X_LAND) ;изменение координаты автомобиля INC HL LD (X_LAND),HL LD DE,200 ;если пройдено расстояние AND A ; меньше 200 знакомест, SBC HL,DE JR NZ,MAIN1 ; то движение продолжается LD BC,100 ;иначе - пауза 2 сек. CALL 7997 JR MAIN ; и переход к началу пути.
Из анализа кода программы видно что все объекты строятся последовательным выполнением Подпрограмм (CALL LAND, CALL LINE1 …) теперь если адрес каждой Подпрограммы сохранить в специальном буфере (внутренняя память плис). То можно получить управляющие сигналы для построения и выделения памяти Для каждого слоя, при таком методе становится неважно где передний фон Или задний, достаточно зафиксировать очередность выполнения команд CALL Последняя подпрограмма будет выведена как передний фон автоматически.
Конечно в реальной игре количество команд CALL может быть очень большим, но ведь ничто не мешает сделать отсев лишних команд используя проверки Дополнительных признаков (пример: если в течении построения кадра очередная. Подпрограмма ни отправила в область экрана ни одного байта, то её можно смело исключить из списка). Таким образом можно сохранить несколько экранов в не зависимой памяти, а при выводе изображения смешивать экраны в нужном порядке при этом можно использовать цепочку элементов AND / OR . При этом Экраны содержащие одни нули игнорируются так как очистка экрана производится стандартными методами в основной памяти видеоадаптера.
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Вторник, 22.11.2016, 15:26 |
|
| |
|