12 сентября 2010 |
|
NeoGS может больше! ьу Alone Coder В NeoGS есть CPLD, которая заполнена лишь частично. Есть исходники (ьу Lord Vader), в которых я ничего не понимаю. Еслм бы нашёлся фанат, можно было бы засунуть туда математический сопроцессор - например, чтобы крутить гораздо более симпатичное 3D, чем в деме The Link. Я говорю не только про освещение. В частности, для нормального 3D нужны текстуры не меньше 128х128, причём с возможностью зацикливания или отсечения переполнения, более того - обязательно натягиваeмыe на объект, а не на отдельную грань. Большие разрешения, отсечение/зацикливание - всё это неудобно для Z80, зато удобно для CPLD. И вообще, с сопроцессором скорость вычислений и отрисовки подпрыгнет в несколько раз. Общение с сопроцессором - через порты с 8-разрядной адресацией, примерно так: ld a,h out (port1),a ld a,l out (port2),a ld a,d out (port3),a ld a,e out (port4),a in a,(port5) Сопроцессор считает одновременно несколько результатов, кладёт их в разные регистры. Их можно прочитать из разных портов. Обязательна арифметика со знаком. Хотелось бы иметь возможность читать значение со сдвигом (иметь кучу портов, из которых читается с разными сдвигами). Возможно, понадобится возможность записи в N-й байт регистра с обнулением всех более младших байтов этого регистра или запись с распространением знака на все более старшие байты этого регистра. Возможные задачи: 1. Декодирование JPEG 2. Вертелка координат с перспективой 3. Пересчёт параметров полигона (для разных шейдеров разные) - требует ветвления или сортировки 3 записей 4. Tekctypuhr 5. Блиттинг Лукаn тоже можно ускорить - вместо 37 тактов (рор hl:add hl,ьс: ldi) получить ini+три обращения к памяти. Блиттинг: Перехватить запись мы не можем, но можем дать уже наложенный байт. По ini (из определённого порта) происходит следующее: Tl=(RA++) Th=(RB++) Выдаётся содержимое ячейки (ThTl) - старшие биты адреса брать из отдельного сneцрeгистра. Это частный случай операции "тайловый tekctypuhr" (при dU=dU`=256, dV=dV`=1), но задача клипирования спрайтов тут не решена. Декодирование JPEG требует ускорения операций: 1. IDCT, 2. побитовое декодирование, 3. пересчёт YUV->RGB. Для IDCT нужна куча регистров (с суммированием произведений), либо DMA, либо зeтник будет всё время подсовывать и высовывать данные. Надо найти оптимальное число регистров и последовательность действий для последнего варианта. Побитовое декодирование: 1. "чтение байта" (выдаёт Rb; Rb=(RA++); RC=8) - чтобы освободить регистровую пару. 2. "чтение бита" (выдаёт Rb; Rb<<=1; RC--; если RC==0, то Rb=(RA++),RC=8) - чтобы можно было inf:jp р или in l,(с):add hl,hl. Tekctypuhr: По ini (из определённого порта) происходит следующее: U+=dU (16-разрядные с отсечением переполнения по 14(15) биту, т.e. при переполнении вверх получается 63(127)+старшие биты, при переполнении вниз - 0+старшие биты) V+=dV (16-разрядные с отсечением переполнения по 14(15) биту) Выдаётся содержимое ячейки (VU) - адрес составляется из старших 8 битов V и U - старшие биты адреса можно взять из модели памяти для зeтника, а лучше из отдельного регистра! Эту же операцию можно использовать для освещения. Эту же операцию можно использовать для отрисовки стен в Wolf 3D (полы и потолки получатся автоматически). Oдноnиксeльная точность (при горизонтальном tekctypuhre) на базе этой операции может быть достигута так: in l,(с):in a,(N): ld h,a:ld d/e,(hl):1/2*push de (с=N) (39.5 тактов на 2 пикс., 970752 такта на весь экран) Tekctypuhr с освещением: По ini (из определённого порта) происходит следующее: U+=dU (16-разрядные с отсечением переполнения по 14(15) биту) V+=dV (16-разрядные с отсечением переполнения по 14(15) биту) Tl=(VU) - адрес составляется из старших 8 битов V и U - старшие биты адреса можно взять из модели памяти для зeтника, а можно из отдельного регистра. U`+=dU` (16-разрядные с отсечением переполнения по 14(15) биту) V`+=dV` (16-разрядные с отсечением переполнения по 14(15) биту) Th=(V`U`) - адрес составляется из старших 8 битов V` и U` - старшие биты адреса можно взять из модели памяти для зeтника, а можно из отдельного регистра. Выдаётся содержимое ячейки (ThTl) - старшие биты адреса можно взять из модели памяти для зeтника, а можно из отдельного регистра. Эту же операцию можно использовать для обычного tekctypuhra (или ротатора) с попиксельной (а не 2-пиксельной) точностью. Эту же операцию можно использовать для отрисовки стен в Wolf 3D с попиксельной точностью (полы и потолки получатся автоматически). Рисование монстров в Wolf 3D: in d,(с):ld e,(hl):ld a,(de): ld (hl),a:inc l (37 тактов на байт) Тайловый tekctypuhr: Для тайлового tekctypuhra 128х128 с тайлами 8х8 с 2-пиксельной точностью надо переделать операцию "tekctypuhr с освещением": 1. отсечение в U, V делать по 15 биту (или без отсечения вообще), а Tl=(VU) должен обязательно брать старшие биты из сneцрeгистра, а не модели памяти зeтника. 2. в U`, V` делать не отсечение по 14(15) биту, а зацикливание (14-15 биты не меняются при U`+=dU`, V`+=dV`). Oдноnиксeльная точность на базе этой операции может быть достигута так: in l,(с):in a,(N):ld h,a:ld d/e,(hl): 1/2*push de (с=N) (39.5 тактов на 2 пикс., 970752 такта на весь экран). Перспективный tekctypuhr с Z-буфером и освещением: Страшные формулы, но тоже возможно.
Other articles:
|
|
|
|
Similar articles:
В этот день... 23 November