Три подхода к видео - ZX Spectrum, C64 и MSX
Небольшое отступление в сторону о домашних компьютерах прошлого и как размышлял сам о выборе решения. Видеоподсистема в них устроена по-разному и это различие напрямую связано с тем, какое решение я выбрал для Z-Frame.
За графику везде отвечал отдельный чип (микросхема) - но вот как он уживался с процессором на шине и в памяти, отличалось принципиально.
ZX Spectrum: общая память, но видео встаёт в очередь
За вывод отвечает ULA (Uncommitted Logic Array - заказная специализированная логическая матрица). Своей
видеопамяти у неё нет, а экран - это просто кусок обычной RAM, первые ~6.9КБ в банке 0x4000 (битовая карта плюс
атрибуты цвета). ULA независимо от процессора вычитывает этот регион и выводит на экран.
Но, в отличие от C64 (ниже), ULA - не хозяин шины: она не захватывает её и не останавливает процессор напрямую.
Конкуренция за общий банк памяти разрешается мягче - через contention: во время активной части кадра приоритет на
нижние 16КБ у ULA, и если процессор обратится к этой памяти в "занятый" момент, его притормаживают вставкой тактов
ожидания (отдельный управляющий сигнал Z80), пока ULA не закончит своё чтение. Видео не правит шиной, а лишь
создаёт "помеху" процессору.
Отсюда, кстати, известная особенность ZX Spectrum: contention затрагивает только нижние 16КБ (где экран), а
верхние 32КБ - "чистые". Код, критичный к таймингам, располагали в верхней памяти - там процессор с ULA не "
конфликтует".
Стоит отметить: ULA - это вообще не "видеопроцессор" в духе VDP или VIC-II. Спрайтов, аппаратного скролла и регистров у неё нет. Помимо картинки она ещё читает клавиатуру, ведёт бипер и кассету, генерирует прерывание кадра. По функциям она беднее и проще, а ту сейчас важна именно её модель доступа к памяти.
C64: видеочип - полноправный хозяин шины
В C64 за картинку отвечает VIC-II. Общается с ним процессор (6502) через память: у 6502 нет отдельного
пространства портов, весь ввод-вывод отображён в обычные адреса (memory-mapped I/O), и регистры VIC-II видны как
ячейки памяти.
Но главное - VIC-II сам активно читает общую с процессором память (экран, знакогенератор, спрайты) и ради этого
вытесняет процессор с шины: на так называемых badline-строках (каждые 8 пикселей по вертикали) он "отбирает"
шину у 6502 и притормаживает его. И именно VIC-II задаёт тактирование, а процессор работает с ним в противофазе.
То есть в C64 видеочип - активный и приоритетный хозяин шины, делящий память с процессором и вытесняющий его.
MSX: своя память, общение через порты
Видеопроцессор (VDP) - отдельный чип со своей собственной видеопамятью (VRAM), отдельной от основной памяти
системы. Процессор (Z80 - MSX тоже был основан на нём) не пускает видеочип в общую память и не делит с ним
шину - вместо этого он сам шлёт данные в VDP через порты. У Z80, в отличие от 6502, порты - это отдельное
адресное пространство, обращения к которому идут инструкциями IN/OUT. Условно OUT (VDP_PORT), A - и байт ушёл в
видеопроцессор, а тот сам разложил его в своей VRAM.
Видео здесь полностью развязано с процессором по памяти: у каждого своя, они не конкурируют за шину, и видеочип не отбирает у CPU такты. Процессор остаётся единственным ведущим.
В итоге
ZX Spectrum - вторгается пассивно: память общая, видео - не мастер на шине, но притормаживает CPU через циклы ожидания.
C64 - вторгается активно: память общая, видеочип - полноправный мастер, вытесняет CPU (badline-стиль).
MSX - своя память, портовое общение, CPU единолично ведущий.
Для Z-Frame я выбрал путь MSX. Вся моя архитектура строится на том, что шиной единолично распоряжается FPGA (арбитр-коммутатор), а устройства к ней не лезут наперегонки. Модели ZX Spectrum и тем более C64, где видео либо тормозит процессор, либо вовсе становится вторым мастером в общей памяти, напрямую конфликтовали бы с этой идеей. "Стиль" MSX подходит лучше всего - видеоподсистема получает свою память и ни за что другое не конкурирует.
И, возвращаясь к параллелям с компьютерами 90-х–2000-х, - вынесенный в отдельный вычислитель видеоадаптер со своей памятью - это та же архитектура, к которой "большие" машины пришли, вынося графику сначала на отдельный порт, а потом и вовсе отдельным устройством со своей видеопамятью.