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:
Contest - Competition for the game Laser Squad continues ...
Studies - The program sort the array in ascending order. The procedure for filling the screen specified attribute. Procedure display pictures. The effect of moving towards the stars. "Shower", coming from the upper left corner of the screen. The procedure of "shedding" pictures on the pixel lines. The program of "pulling" the picture at an angle of 45 degrees. Three procedures "Scroll".

В этот день...   31 March