+---------------+
 ASSEMBLY XXIV 
+---------------+

    At  agora  vimos  os  registradores  MapMask,  BitMask, "Enable
Set/Reset" e Set/Reset.  Vimos tambm que  MapMask  permite  ou  no
mudanas  nos  quatro  planos  de  bits  idependentemente.   BitMask
mascara os bits no desejveis (e esses so lidos dos latches quando
escrevemos  na  memria).   Ainda  por  cima,  vimos  que  possvel
atualizar  os  quatro  planos  de  bits  ao  mesmo  tempo  com  bits
diferentes usando "Enable Set/Reset"  e Set/Reset.  Isso tudo usando
o modo de escrita 0!


     Modo de escrita 1

    O modo de escrita 1  lida  somente  com os latches da placa VGA.
Com esse modo podemos copiar o contedo dos quatro planos de bits de
uma posio para outra com uma nica instruo em assembly!

    Como  j  vimos,  os  latches  dos  quatro planos so carregados
sempre que fazemos uma leitura  na  memria  do sistema (em todos os
modos de escrita!).  No modo 1 isso tambm vale.  S que nesse  modo
no  possvel  escrever  nada  nos  planos de bits!!  Simplesmente,
quanto mandamos escrever numa  determinada  posio  da  memria  do
sistema,  os  latches   que atualizaro essa posio.  No modo 1 os
registros Set/Reset, "Enable Set/Reset" e BitMask no funcionam para
nada. Assim, depois de setado o modo 1, podemos usar:

 +-----------------------------------------------------------------+
   REP MOVSB                                                      
 +-----------------------------------------------------------------+

    Para copiarmos bytes dos quatro  planos  de vdeo de uma posio
da tela para outra.  E RAPIDO!  S  que  tem  um  pequeno  problema:
Podemos  copiar  BYTES  e  no pixeis individuais!  Lembre-se que um
byte contm oito pixeis (com  cada  bit  de  um pixel em um plano de
bits!).  Se sua inteno  copiar um bloco inteiro,  porm  alinhado
por  BYTE, ento o modo 1  a escolha mais sensata.  Caso contrrio,
use outro modo de escrita (o modo 0, por exemplo!).

    Ahhh... podemos conseguir o mesmo efeito do modo de escrita 1 no
modo de escrita 0!  Basta zerarmos  todos os bits de BitMask!  Pense
bem:  Se BitMask est completamente zerado,  ento  os  dados  viro
apenas  dos  latches!   O  que  nos  deixa  com  um  modo de escrita
obsoleto, j que podemos fazer o mesmo trabalho no modo 0! :)


     O registrador MODE

    Para  ajustar o modo de escrita precisamos de um registrador.  O
registrador MODE  descrito abaixo:

                            7 6 5 4 3 2 1 0
                           +--------+
                           ?    ?  
                           +--------+
                                     
                              +-     +------- Modo de escrita
                                  +----------- Modo de leitura
                                 +------------- Odd/Even
                                +--------------- Deslocamento

    O  nico  campo  que  nos  interessa  no  momento    o "Modo de
escrita".  Por isso, para  modificar  o  modo,  precisaremos  ler  o
registro  MODE,  setar  o  modo de escrita, e depois reescrev-lo...
para que no faamos mudanas nos  demais bits.  Os modos de escrita
vlidos so os citados anteriormente (repare que esse  campo  tem  2
bits de tamanho!).

    O  registrador  MODE  faz  parte  do  circuito  GC  (o  mesmo de
BitMask, "Enable Set/Reset" e Set/Reset)  da placa VGA, seu ndice 
5.

    Well... j que o  modo  1    obsoleto,  vou colocar aqui alguns
macros para facilitar o entendimento dos prximos cdigos-fonte, ok?

 +-----------------------------------------------------------------+
   ; VGA.INC                                                      
   ; Macros para VGA!                                             
   ; Todos os macros alteram dx e ax                              
                                                                  
   ; Macro: Ajusta o modo de escrita                              
   macro   SetWriteMode    mode                                   
           ifdifi <mode>,<ah>                                     
               mov     ah,mode                                    
           endif                                                  
           mov     dx,3CEh                                        
           mov     al,5                                           
           out     dx,al                                          
           inc     dx                                             
           in      al,dx                                          
           and     ax,1111111100b                                 
           or      al,ah                                          
           out     dx,al                                          
   endm                                                           
                                                                  
   ; Macro: Habilita/Mascara os planos de vdeo                   
   macro   MapMask plane                                          
           ifdifi  <plane>,<ah>                                   
               mov     ah,plane                                   
           endif                                                  
           mov     al,2                                           
           mov     dx,3C4h                                        
           out     dx,ax                                          
   endm                                                           
                                                                  
   ; Macro: Habilita os bits                                      
   macro   BitMask bit                                            
           ifdifi  <bit>,<ah>                                     
               mov     ah,bit                                     
           endif                                                  
           mov     al,8                                           
           mov     dx,3CEh                                        
           out     dx,ax                                          
   endm                                                           
                                                                  
   ; Macro: Altera "Enable Set/Reset"                             
   macro EnableSetReset    bitmsk                                 
           ifdifi  <bitmsk>,<ah>                                  
               mov     ah,bitmsk                                  
           endif                                                  
           mov     al,1                                           
           mov     dx,3CEh                                        
           out     dx,ax                                          
   endm                                                           
                                                                  
   ; Macro: Ajusta Set/Reset                                      
   macro SetReset value                                           
           ifdifi  <value>,<ah>                                   
               mov     ah,value                                   
           endif                                                  
           sub     al,al       ; altera tb os flags..             
           mov     dx,3CEh                                        
           out     dx,ax                                          
   endm                                                           
 +-----------------------------------------------------------------+

