4 плоскости по 2 экрана с 2 слоями........ Это сколько там памяти надо угрохать только на отображение картинки? Плюс ещё всё это крутить программно...
Всё таки, надо как-то попроще.
Моё видение идеального: 4 банка для: экранной области, исходных пикселей, исходных атрибутов и исходных масок. Аппаратный блитер. Экран имеет линейную структуру строк. Раздельный bright для paper и ink вместо flash.
1) Отдельная видеокарта, работающая от системного кварца (упрощает синхронизацию).
2) 2 видеорежима - "стандартный" с байтом атрибутов на знакоместо 8х8 пикселей и расширенный с байтом атрибутов на байт пикселей (8х1), режим выбирается битом в байте конфигурации. Итого 6,75 или 12 килобайт памяти экранной области. Может располагаться в 16 килобайтах из РУ6.
3) Три банка по 64 или 256 килобайт для пикселей, атрибутов и масок. Адреса в них совпадают байт в байт, поэтому, при копировании одновременно читается 3 байта из всех 3 банков и далее записывается в экранную память.
4) Аппаратный блитер программируется так, передаётся адрес начала экранной области (2 байта), количество байт в строке (1 байт, значение 1 - 32), количество пропускаемых байт после строки (1 байт, значение 0 - 31), количество копируемых строк (1 байт, значение 1 - 191), адрес начала копируемого спрайта (3 или 4 байта для будущих расширений памяти). Управляющий байт (1 байт), содержит биты режима атрибутов экрана (8х8 или 8х1), режим копирования атрибутов спрайтов (копирование с атрибутом или копирование без атрибута), бит запуска копирования. Чтением бита запуска копирования можно определить окончание копирования этого спрайта. Итого, 9 или 10 байт. Исходные спрайты имеют линейную структуру строк, поэтому, они просто копируются на экран подряд. Если есть желание, можно добавить количество пропускаемых байт после копирования строки, тогда можно будет вырезать куски из большой картинки. В итоге, в режиме байт атрибутов на байт пикселей получаем по горизонтали точность 8 пикселей, а по вертикали точность 1 строка, что позволит облегчить написание игр.
Расчёт скорости. РУ5 работает с частотой чтения 3500000 операций в сек. Из них половина уйдёт на вывод видео, оставшиеся 1750000 (байт/с) получается 1750000 / 50 = 35000 байт за фрейм. Получается, можно успеть 3 раза заполнить видимый экран, что хватит для большинства игр. Так же, во время бордюра можно использовать все циклы записи и скорость увеличится ещё.
В итоге, если начать строить кадр сразу после начала нижнего бордюра, то ещё до КСИ можно заполнить фон, а до начала отображения видимых строк можно вывести все спрайты. Если не получается вывести все спрайты, то можно сначала выводить верхние, а потом более нижние спрайты, тогда вывод успеет до отображения соответствующего спрайта на экране.
При копировании можно задать режим копирования с атрибутам и без. Если без атрибутов, то скорость может быть в 2 раза выше. Итак, читаются 3 байта из 3 банков, байт маски попадает в регистр, который пропускает или не пропускает сигнал WR на микросхемы экранной памяти соответствующих битов, поэтому 1 битные микросхемы будут гораздо удобнее в качестве экранной памяти. А байт атрибутов копируется как есть, если он есть.
В итоге, благодаря скорости заполнения экрана задний буфер для предварительного построения картинки становится не нужен.
Хм, из 35000 байт за кадр байты атрибутов съедят половину... Тогда можно атрибуты разместить в отдельный банк памяти. И в этом случае, копирование как с атрибутами, так и без будет одинаково быстрым.
Так же, в игре часто выводится рамка игрового поля, а так же, разная информация и статистика. Можно добавить ещё один слой маски, который можно разместить в банке атрибутов экранной памяти, эта маска в нужных местах будет показывать стандартный экран спектрума поверх всей картинки, тогда можно будет один раз задать маску и на стандартном экране выводить состояние игры и статистику, и эта информация будет всегда на верху и не надо будет эту информацию собирать из спрайтов и строить каждый кадр.
Управление блитером можно осуществлять, выделив ему ячейки памяти, а не порты. Дешифровка нужна более полная, а не как у портов. Можно выделить 16 байт памяти на управление блитером.
В итоге, 16 корпусов РУ6, 24 корпуса РУ5 или РУ7, а так же, счётчики, регистры и сумматоры для блитера.
Думаю, если делать, то надо делать именно так, на элементах тех лет.




Ответить с цитированием