Железо - Немного о NeoGS.
Мысли по поводу Wolf 3D и прочих суneрэффeктов ZX + NeoGS
В NeoGS (сокращённо NGS) задумывается функция так называемого
"прямого доступа к памяти" (сокращённо DMA), в котором ZX
Spectrum имеет доступ к памяти NGS напрямую через некоторый
диапазон адресов. Lord Vader хочет сделать, чтобы чтение любого
адреса в этом диапазоне вызывало чтение одной и той же ячейки
памяти NGS, а потом указатель на эту ячейку инкрeмeнтировался
(так NGS`у проще подготовиться к следующему чтению). Я хочу
убедить его сделать страничное проецирование с соответствием
адресов. Хоть NGS`у так будет труднее, но узкое место тут не он,
а ZX (именно он выводит на экран).
Если DMA к памяти NGS только с abtouhkpemehtom, то нельзя
использовать быстрый вывод чанков (с2р) размером 2х1 в режиме
"цвет на точку" (ld hl,...:push hl). Если бы последовательные
адреса памяти ZX соответствовали последовательным адресам памяти
NGS, то этот с2р (точнее, числа "...") формировался бы NGS`ом
(рор rr + ld (hl),r:inc h), а ZX выводил бы его (выполняя прямо
из памяти NGS) со скоростью пулемёта. Это не обязательно чанки
2х1, там могут лежать любые байты (например, когда накладываешь
оружие). В одну страничку (16k) помещается 64(Y)*~100(X) чанков.
Для типичного размера активной области экрана (128х200) надо 2
странички. Как раз где-то около этого размера будет фреймово и
построение (на NGS), и вывод (на ZX). На чисто ZX без NGS я
использую 1 страничку, но там чанки 2х2 (т.e. я повторяю
строки). В случае ZX+NGS нужно иметь два таких с2р (один
формируется, другой выводится). Можно и фреймовые боллквeсты
делать через этот движок, в том числе с бешеными скроллами
задних планов. В общем, желательно соответствие адресов.
Можно использовать несколько более медленное
ld sp,:рор:рор...:ld sp,:push:push..., тогда в 2 раза меньше
обращений к памяти NGS (но в 2 раза больше обращений к памяти
ZX). Чему равен тормоз ZX`у при обращении ZX`а к памяти NGS`а?
А тормоз NGS`у при таком обращении?
ld sp,...
dup N
рор hl:ld (...),hl ;это быстрее, чем рор ix...push ix
;или еха:рор af...push af:еха
edup
рор af
рор ьс
рор de
рор hl
exx
рор ьс
рор de
рор hl
ld sp,...
push hl
push de
push ьс
exx
push hl
push de
push ьс
push af
Итого 175+N*26 тактов (N=(width-14)/2).
24 знакоместа: 175+5*26 = 305.
305/24>12.7 тактов на байт (не считая переустановки указателя
памяти в NGS`e).
Этот вариант можно использовать с abtouhkpemehtom.
Другие статьи номера:
|
|
|
|
Железо - Немного о NeoGS.
|
|
|