18 мая 2009 |
|
Мысли по поводу 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.
Other articles:
|
|
|
|
Similar articles:
В этот день... 21 November