
                               ASSEMBLY
                             Modo de escrita na tela
                                Aula nr. 26 de 26

    Vistos os trs  primeiros  modos  de  escrita  da placa VGA, nos
resta apenas o modo 2.  Esse modo    muito  til  para  escrita  de
bitmaps  nos modos de vdeo de 16 cores...  Ele trabalha basicamente
como o  registro  Set/Reset,  sem  que  tenhamos  que  manusear esse
registro explicitamente.


     O modo de escrita 2

    Uma vez setado, o modo de escrita 2  habilita  todos  os  quatro
bits  de "Enable Set/Reset", da mesma forma que o modo de escrita 3.
No entanto, diferente do modo de escrita 3, o registro Set/Reset no
precisa ser ajustado com  a  "cor"  desejada.  Neste modo o registro
Set/Reset  setado com os quatro bits menos significativos  enviados
pela  CPU    memria do sistema.  Precisaremos mascarar os bits no
desejados em BitMask, bem como  ajustar  os planos de bits desejados
em MapMask.

    Repare na fora  deste  modo  de  vdeo...  poderemos  atualizar
pixels  com a "cor" que quisermos sem usarmos Set/Reset diretamente,
e sem termos que setar os  bits de "Enable Set/Reset".  Mas, teremos
que ajustar BitMask para no setarmos todos os oito pixels  no  byte
que estamos escrevendo dos planos de bits...  Eis um exemplo do modo
de escrita 2:

 Ŀ
   ideal                                                          
   model tiny                                                     
   locals                                                         
   jumps                                                          
                                                                  
   include "vga.inc"                                              
                                                                  
   LINE_LENGTH     equ     80                                     
                                                                  
   codeseg                                                        
   org     100h                                                   
   start:                                                         
       mov     ax,12h  ; Ajusta modo de vdeo 640x480x16          
       int     10h                                                
                                                                  
       WriteMode   2      ; modo de escrita 2                     
       MapMask     1111b  ; todos os planos de bits               
                                                                  
       mov     ax,0A000h                                          
       mov     es,ax      ; ES = segmento de vdeo                
                                                                  
       sub     di,di      ; DI = offset                           
       sub     bl,bl      ; usaremos BL p/ contar as linhas.      
                                                                  
       mov     ah,10000000b ; ah = bitmask inicial                
       mov     cl,1000b     ; CL = cor inicial                    
                                                                  
   @@1:                                                           
       BitMask ah                                                 
       mov     al,[es:di]  ; carrega latches                      
       mov     [es:di],cl  ; escreve nos planos                   
       ror     ah,1        ; rotaciona bitmask                    
       inc     cl          ; prxima cor                          
       cmp     cl,10000b   ; ops... ultrapassou?!                 
       jb      @@1         ; no... ento permanece no loop.      
       mov     cl,1000b    ; ajusta p/ cor inicial.               
       add     di,LINE_LENGTH ; prxima linha                     
       inc     bl          ; incrementa contador de linhas        
       cmp     bl,8        ; chegou na linha 8?                   
       jb      @@1         ; no... continua no loop.             
                                                                  
       sub     ah,ah       ; espera tecla, seno no tem graa!   
       int     16h                                                
                                                                  
       mov     ax,3        ; volta ao modo texto...               
       int     10h                                                
                                                                  
       int     20h         ; fim do programa.                     
   end start                                                      
 

    Esse modo parece mais fcil  que os demais, no?!  Aparentemente
... mas tenha em mente que os outros modos de  escrita  tambm  tm
suas vantagens.


     E os modos de leitura?!

    Na  grande maioria das vezes no  vantajoso lermos os dados que
esto nos planos de bits...  Isso  porque  a memria de vdeo  mais
lenta que a memria do sistema (mesmo a memria do sistema associada
 placa VGA  mais lenta que o resto da memria  do  seu  PC...  por
causa  dos WAIT STATES que a placa VGA adiciona para no se perder -
a velocidade da CPU  maior  que  a  do circuito de vdeo!).

    Para  encerrarmos  os  modos  de  16 cores  interessante vermos
alguma coisa sobre o modo  de  leitura  0,  que   o modo default da
placa VGA.

    No modo de leitura 0 devemos ler um plano de bits por vez... no
 possvel ler mais que um plano ao mesmo tempo... e ainda,  MapMask
no  responsvel pela habilitao dos planos de bits.  Nesse caso a
leitura  feita atravs de uma ramificao do circuito de vdeo... a
escrita  feita por  outra.   O  registrador  BitMask tambm no tem
nenhum efeito na leitura.  Por isso a seleo dos bits fica por  sua
conta (atravs de instrues AND).

    A  seleo  do  plano  de  bits  que  ser  lido    feito  pelo
registrador ReadMap que  descrito abaixo:

         Registrador READMAP

                7 6 5 4 3 2 1 0
               ͻ
               ??????  
               ͼ
                             
                             Seleo do plano de bits

    ReadMap  tambm  faz  parte do circuito GC...  Ento  acessvel
via endereos de I/O 3CEh  e  3CFh,  da  mesma forma que BitMask e o
registro de MODE, s que seu ndice  4.

    Uma nota importante  a de que, embora a leitura seja feita  por
uma ramificao diferente (por isso a existncia de ReadMap), quando
fazemos   uma   leitura   dos   planos   de  bits,  os  latches  so
automaticamente carregados... e  os  latches pertencem  ramificao
do  circuito  de escrita (somente os latches dos planos selecionados
por MapMask so carregados, lembra?!).

    E z fini... pelo menos at o prximo texto! :)

