Выслал проект на почту.
И ссылка на Google Диск
https://drive.google.com/drive/folde...Tg&usp=sharing
Выслал проект на почту.
И ссылка на Google Диск
https://drive.google.com/drive/folde...Tg&usp=sharing
Последний раз редактировалось Napoleon1; 20.09.2022 в 17:20.
Спасибо, получил и успел уже бегло посмотреть... Что сразу порадовало:
- замена к155ру2. Возможно это было сделано в первую очередь для режимов с 64 и более цветами, но всё равно это шаг вперёд.
- замена видеоЦАП на резисторах на ADV7120(7125) -- я об этом думал, но так и не решился опробовать... (не в обиду адептам 100% совпадения цветов палитры, но это должно давать хорошую равномерность градиента по цветам)
- выход на cxa2075. Пожалуй, лучший вариант для вывода на телевизор, в том числе, думаю, и по rgb на скарт.
И что огорчило:
- организация видеопамяти осталась в 32 бита, как на стандартном Векторе. Можно было бы сделать 16 бит, как в схеме ПК-6128, а то и вообще сократить до 8 бит.
Буду изучать схему дальше...
Выходную видеопамять я сначала искал двухпортовую, это было бы проще, но подходящей не нашёл. Пришлось ставить обычную с громадным избытком по объёму. Заодно использовал её же в других местах.
ЦАП сначала тоже хотел городить на резисторах, но получилось очень громоздко - с готовым ЦАПом гораздо компактнее и проще.
А насчёт битности памяти - чем это плохо? Учитывая время выборки принципиально можно было бы сделать 16 бит, но понадобились бы промежуточные регистры и другие мультиплексоры адреса. А суммарно всё равно микросхем ОЗУ столько же, поскольку требуются однобитные микросхемы, чтобы работал механизм маски записи в ОЗУ.
Поэтому не удалось применить современные микросхемы. Зато получилось аутентично :-)
Да, я замелил избыток, но он не критичен. Хотя, избыток можно было бы использовать под хранение нескольких наборов цветов палитры и быстро их переключать, но оставим это улучшение на потом. А с двухпортовой памятью может и было бы проще, но смысла там в ней нет -- это же не видеопамять, когда нужно писать и читать одновременно по разным адресам, тут просто палитра, которая иногда пишется между кадрами.
Это не плохо, просто сокращение битности до 16 позволит сократить количество корпусов памяти вдвое, и можно будет применять более ёмкую память, а то и вовсе перейти полностью на статику...
Посмотрите схему ПК-6128, там это элегантно решили всего одной микрухой-триггером, делая задержку на 1 бит по двум каналам, что позволило читать данные последовательно по 16 бит.
Второй вариант -- использовать 74HCT597, там сдвиговый регистр дополнен защёлками на параллельном входе, можно асинхронно записать туда байт, а потом, в нужный момент, загрузить его в регистр. Как это работает можно глянуть в схеме моей графической платы.
А что за "механизм маски записи в ОЗУ", извиняюсь?
"46h - порт маски записи", 12я страница Вектор Турбо.docx. На мой субъективный взгляд околоEGAшные возможности (порты 45h и 46h) в том виде, в котором они сделаны, приносят проекту больше вреда чем пользы. Другое дело, если бы они были поддержаны большим количеством ПО, но на это вряд ли можно рассчитывать.
Последний раз редактировалось ivagor; 21.09.2022 в 07:06. Причина: исправил опечатку
Improver (21.09.2022)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Как то так.
Код:; Вывод символа на экран ; HL - адрес символа в знакогенераторе (символ шириной 6 пикселей в младших битах) ; E - младший байт адреса символа на экране (позиция строки) ; A - позиция символа в строке ; Принцип отображения для 40 символов в строке: ; 0 символ - сдвиг 2, символ в старших битах байта ; 1 символ - сдвиг 4, 2 бита в этом столбце, 4 - в следующем ; 2 символ - сдвиг 6, 4 бита в этом столбце, 2 - в следующем ; 3 символ - сдвиг 0, символ в младших битах байта ; Дальше всё повторяется DrawSymb: di push hl ld b,a and 3ch rrca ld c,a rrca add a,c add a,0e0h ; Выводить будем в верхнюю плоскость ld d,a ; Получаем горизонтальный полуадрес левого байта из 3 байтов, где могут быть 4 символа ld a,b and 3 ; Выделяем биты, определяющие сдвиг символа ld bc,0300h ; Маска для 0 символа ld l,2 ; На сколько нужно сдвинуть влево байт символа при выводе на экран jr z,DrawSymb1 dec a ld bc,0fc0fh ; Маска для 1 символа ld l,4 jr z,DrawSymb1 inc d dec a ld bc,0f03fh ; Маска для 2 символа ld l,6 jr z,DrawSymb1 inc d ; в D получается полуадрес левого байта, где будет часть или весь символ ld bc,0c000h ; Маска для 3 символа ld l,0 DrawSymb1: ld a,l pop hl ; Восстанавливаем указатель на символ в знакогенераторе or a,0c0h ; Добавляем 3 бита системных параметров out (45H),a ; Включаем циклический сдвиг ld a,с ex af,af' ; Сохраняем маску для второго байта ld a,b out (46H),a ; Включаем маску для первого байта ld bc,8 ; Высота символа ldir ; Выводим левую часть символа ex af,af' ; Восстанавливаем маску для второго байта and a jr z,DrawSymb2 ; Весь символ в одном байте out (46H),a ; Включаем маску для второго байта dec hl dec e ld bc,8 lddr ; Выводим правую часть символа DrawSymb2: xor a out (46H),a ; ld a,0e0h out (45H),a ; ei ret
Последний раз редактировалось Napoleon1; 21.09.2022 в 21:06.
Для сравнения переделал в софтовую процедуру вывода 40 символов в строке, принцип вывода аналогичный, надеюсь это не вызовет возражений.
Скрытый текст
Код:DrawSymbSoft: ld b,a and 00111100b rrca rrca add a,0e0h ; Выводить будем в верхнюю плоскость ld d,a ; Получаем горизонтальный полуадрес левого байта из 3 байтов, где могут быть 4 символа ld a,b and 3 ; Выделяем биты, определяющие сдвиг символа jp nz,DrawSymbSoft1 ;0 ld b,00000011b ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rlca\ rlca\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ rlca\ rlca\ or c\ ld (de),a ret DrawSymbSoft1: dec a jp nz,DrawSymbSoft2 ;1 ld b,11111100b ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ rrca\ rrca\ rrca\ rrca\ and 11b\ or c\ ld (de),a inc d ld b,00001111b ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ add a,a\ add a,a\ add a,a\ add a,a\ or c\ ld (de),a ret DrawSymbSoft2: dec a jp nz,DrawSymbSoft3 ;2 ld b,11110000b ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ inc hl\ rrca\ rrca\ and 1111b\ or c\ ld (de),a\ inc e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ rrca\ rrca\ and 1111b\ or c\ ld (de),a inc d ld b,00111111b ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ dec hl\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a\ dec e ld a,(de)\ and b\ ld c,a\ ld a,(hl)\ rrca\ rrca\ and 11000000b\ or c\ ld (de),a ret DrawSymbSoft3: ;3 ld b,11000000b ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ inc hl\ ld (de),a\ inc e ld a,(de)\ and b\ or (hl)\ ld (de),a ret[свернуть]
Точных растактовок для турбо я не знаю (тем более они вроде бы разные для активной области изображения и бордюра), поэтому посчитал для "стандартного z80" на векторе (т.е. с векторовским торможением) при 3 МГц. В зависимости от позиции получается 508/1168/1120/416 тактов. Позиции по горизонтали равновероятные, поэтому среднее значение 803 такта.
Чтобы подравнять силы в DrawSymb заменил ld bc,8\ ldir и ld bc,8\ lddr на 8 ldi и 8 ldd соответственно. Получилось 388/600/636/476 тактов. В среднем 525 тактов. 803/525=1.53
Полтора раза это хорошо, но это совсем не три раза (которые должны были быть минимумом).
И это не все.
1. Если добавить к процедуре вычисление адреса символа по его коду, то выигрыш еще уменьшится.
2. Процедуру софтового вывода можно заметно оптимизировать. Памяти много, можно хранить 4 предсдвинутых варианта символов. Выигрыш становится еще меньше.
3. Запрещение прерываний может еще приемлемо для вывода символов, но не для спрайтов в игре при наличии фоновой музыки.
Последний раз редактировалось ivagor; 21.09.2022 в 21:52.
Improver (21.09.2022)
Насчёт трёх раз - я имею в виду соотношение: (обращения к портам + простая перепись данных) и (чтение символа + чтение байта с экрана + сдвиг + or/and + запись). И в целом программа получается компактнее.
Насчёт растактовки - все циклы, связанные с обращением к памяти, выравниваются на 4 такта. Скорость одинаковая в любой момент. Программирование расширенной палитры не тормозит процессор.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)