
                               ASSEMBLY
                          Placas de vdeo e programao
                                Aula nr. 23 de 26

    Confesso a todos vocs  que  a  experincia  que venho tendo com
relao a programao da placa VGA comeou com a leitura de  artigos
e de um livro  de  um  camarada  chamado Michael Abrash...  Gostaria
muito de conseguir outros livros desse sujeito!!  Alis, se  puderem
colocar  as  mos  num livro chamado "Zen of Graphics Programming",
garanto  que  no  haver arrependimentos!   um excelente livro com
MUITOS macetes, rotinas e explicaes  sobre a VGA...  Tudo isso com
bom humor!!! :)

    Outra boa aquisio, pelo menos com  relao ao captulo 10,  o
livro "Guia do Programador para as placas  EGA  e  VGA"  da  editora
CIENCIA  MODERNA  (o  autor    Richard  E.  Ferraro).  Explicitei o
captulo 10 porque acho que  esse  livro  s  no  to bom devido a
falhas de traduo (coisa que acontece com  quase  todos  os  livros
traduzidos   no  Brasil!)...   O  captulo  10    to  somente  uma
referncia (enorme e confusa,  mas  quebra  bem  o galho) a todos os
registradores da VGA.  Esse  um dos livros que adoraria poder ter o
original, em ingls!


     Onde paramos?!

    Ahhh... sim... at aqui vimos o  modo  de  escrita  "normal"  da
placa VGA.  Esse modo de escrita  o usado pela BIOS e    conhecido
como  "modo  de  escrita 0".  Antes de passarmos pra outros modos de
escrita  vale  a   pena   ver   o   funcionamento   de  outros  dois
registradores:   o  "Enable  Set/Reset"  e  o  "Set/Reset".    Esses
registros,  como  voc vai ver, facilita muito o trabalho de escrita
nos planos de bits.


     Ligando e desligando bits...

    Na listagem do text 22 vimos que  possvel a escrita em mais de
um plano de bits ao mesmo tempo (basta habilitar em MapMask).  Vimos
tambm que  os  planos  de  bits  no  habilitados  para escrita via
MapMask no so automaticamente  zerados...  lembra-se  do  caso  do
pixel branco que queriamos transformar em magenta?!

    Com tudo isso, tinhamos que fazer pelo menos 3 acessos  memria
do  sistema:  Uma leitura para carregar os latches, uma escrita para
setar bits nos planos selecionados, e mais uma escrita para zerar os
bits dos outros planos...  Isso  sem contar com os registradores que
teremos que atualizar:  MapMask  e  BitMask.   Surpreendentemente  a
instruo  OUT   uma das que mais consomem ciclos de mquina da CPU
(especialmente nos 386s e 486s! Veja no seu HELP_PC).

    Na tentativa de  reduzir  os  acessos    memria  do sistema (e
indiretamenta aos planos de bits!), lanaremos mo dos registradores
"Enable Set/Reset" e "Set/Reset".  Eis a descrio deles:

         REGISTRO ENABLE SET/RESET

                            7 6 5 4 3 2 1 0
                           ͻ
                           ????    
                           ͼ
                                       
                                        S/R bit 0
                                       S/R bit 1
                                      S/R bit 2
                                     S/R bit 3

         REGISTRO SET/RESET

                            7 6 5 4 3 2 1 0
                           ͻ
                           ????    
                           ͼ
                                       
                                        plano 0
                                       plano 1
                                      plano 2
                                     plano 3

    O registrador "Enable Set/Reset" informa  a placa VGA quais bits
do registrador "Set/Reset" vo ser transferidos para  os  planos  de
bits.  Note que cada bit de "Set/Reset" est associado a um plano de
bits!  Os bits no habilitados em "Enable Set/Reset" viro da CPU ou
dos latches, dependendo do contedo  de  BitMask  -  como  vimos  no
exemplo do texto 22.

    No sei se voc percebeu, mas podemos agora escrever quatro bits
diferentes  nos quatro planos de bits ao mesmo tempo...  Se setarmos
os quatro bits de "Enable  Set/Reset", os quatro bits em "Set/Reset"
sero transferidos para a memria de vdeo.  Nesse caso o que a  CPU
enviar para a memria do sistema ser ignorado (j que  "Set/Reset"
que est fornecendo os dados!).

    Os registradores MapMask  e  BitMask  continuam funcionando como
antes...  Se no habilitarmos um ou  mais planos de bits em MapMask,
este(s) plano(s)  no  ser(o)  atualizado(s)!   Note  que  "Enable
Set/Reset"  diz ao circuito da placa VGA que deve ler os respectivos
bits de "Set/Reset" e  coloc-los  nos respectivos planos de bits...
mas, MapMask pode ou no permitir essa transferncia!!!   Quanto  ao
registrador  BitMask,  vai bem obrigado (veja discusso sobre ele no
texto anterior).

    Hummm... virou baguna!  Agora podemos  ter dados vindos de trs
fontes:  da  CPU  (via  memria  do  sistema),  dos  latches,  e  do
registrador  Set/Reset.   Bem...  podemos  at  usar essa baguna em
nosso favor!

    "Enable Set/Reset" e "Set/Reset"  pertencem ao mesmo circuito de
BitMask:  o controlador grfico  (GC).   S  que  o  ndice (que  o
nmero do registro no circuito!) de "Set/Reset"   0  e  de  "Enable
Set/Reset"  1.

    Vamos a um exemplo com esses dois registradores:

 Ŀ
   ; VGA3.ASM                                                     
   ; Compile com:                                                 
   ;                                                              
   ;   TASM vga3                                                  
   ;   TLINK /x/t vga3                                            
   ;                                                              
   ideal                                                          
   model tiny                                                     
   locals                                                         
   jumps                                                          
                                                                  
   codeseg                                                        
                                                                  
   org 100h                                                       
   start:                                                         
       mov     ax,12h      ; Poe no modo 640x480                  
       int     10h                                                
                                                                  
       mov     ax,0A000h   ; Faz ES = 0A000h                      
       mov     es,ax                                              
       sub     bx,bx       ; BX ser o offset!                    
                                                                  
       mov     dx,03C4h                                           
       mov     ax,0F02h    ; MapMask = 1111b                      
       out     dx,ax                                              
                                                                  
       mov     dx,03CEh                                           
       mov     ax,8008h    ; BitMask = 10000000b                  
       out     dx,ax                                              
       mov     ax,0500h    ; Set/Reset = 0101b                    
       out     dx,ax                                              
       mov     ax,0F01h    ; Enable Set/Reset = 1111b             
       out     dx,ax                                              
                                                                  
       mov     al,[byte es:bx]     ; carrega os latches da VGA    
                                   ;  note que AL no nos         
                                   ;  interessa!!!                
                                   ; Isso  necessrio pq vamos   
                                   ;  alterar apenas o bit 7. Os  
                                   ;  demais so fornecidos pelos 
                                   ;  latches.                    
                                                                  
       mov     [byte es:bx],al     ; Escreve qualquer coisa...    
                                   ;  AL aqui tambm no nos      
                                   ;  interessa, j que Set/Reset 
                                   ;   quem manda os dados para  
                                   ;  os planos de bits.          
                                                                  
       sub     ah,ah       ; Espera uma tecla!                    
       int     16h         ; ... seno no tem graa!!! :)        
                                                                  
       mov     ax,3        ; Volta p/ modo texto 80x25            
       int     10h                                                
                                                                  
       int     20h         ; Fim do prog                          
                                                                  
   end start                                                      
 

    Explicando a listagem acima:  Os quatro planos  so  habilitados
em MapMask... depois habilitamos somente o bit 7 em BitMask, seguido
pela   habilitao   dos  quatro  bits  de  "Set/Reset"  em  "Enable
Set/Reset".  Uma vez  que  os  quatro  planos esto habilitados (por
MapMask) e que os quatro  bits  de  "Set/Reset"  tambm  esto  (via
"Enable  Set/Reset"),  colocamos  em  "Set/Reset" os quatro bits que
queremos que  sejam  escritos  nos  planos:   0101b  (ou 05h).  Pois
bem... precisamos apenas carregar os latches e  depois  escrever  na
memria do sistema.

    Tudo bem, vc diz, mas qual  a grande  vantagem?!   Ora,  ora...
temos condies de alterar os quatro planos de bits ao mesmo tempo!!
E,  melhor  ainda,  estamos  em condio de setar at oito pixeis ao
mesmo tempo!!!!  Experimente trocar a linha:

 Ŀ
       mov     ax,8008h    ; BitMask = 10000000b                  
 

    por:

 Ŀ
       mov     ax,0FF08h   ; BitMask = 11111111b                  
 

    Voc ver oito pixeis magenta  com  uma nica escrita na memria
do sistema!!

    Outra  grande  vantagem    o  ganho de velocidade:  Na listagem
acima os dados que  vo  ser  colocados  nos  planos de bits no so
fornecidos diretamente pela CPU, mas sim  por  "Set/Reset"  e  pelos
latches.   Assim,  a  placa VGA no se interessa pelo contedo de AL
que foi escrito na memria do sistema e no adiciona WAIT STATES, j
que esse dado no vai para a memria de vdeo (fica s na memria do
sistema!!).

     um grande avano, n?!   Well... prximos avanos nos prximos
textos.
                                                             
