
Captulo 35 - unit crt

  a parte bsica de nosso estudo est, praticamente, terminada. A partir
deste ponto, vamos comear a trabalhar mais com os recursos das unidades
(UNIT) e desta forma, a primeira unidade que veremos  a CRT, da qual j
vimos algumas funes em outros captulos. 

CRT - como j vimos anteriormente nesta unidade, temos as rotinas que favo-
recem as tarefas de manipulao de vdeo e de gerao de som porm, alm 
destas rotinas esto disponveis algumas constantes e variveis. Vejamos ento
a unidade.

ASSIGNCRT - este procedimento faz parte da UNIT CRT, e  ele quem possibilita
a associao de um arquivo do tipo TEXTO com a console para sada. No caso
de vdeo, esta forma de sada ou eventualmente de entrada, possibilita uma
maior velocidade em relao s operaes de entrada e/ou sada standards de
vdeo. Este procedimento  bastante parecido com o procedimento ASSIGN
que j vimos anteriormente, exceto ao que se refere ao nome do dispositivo
que, neste caso, no  informado. Sua sintaxe:
ASSIGNCRT (VAR <arq> : TEXT);
Vejamos um exemplo:
PROGRAM teste_assigncrt;
USES CRT;
VAR
  arq : TEXT;
BEGIN  
  CLRSCR;
  GOTOXY (10,1);
  WRITE (a sada ser na impressora ou vdeI/V?);
  IF UPCASE (READKEY) = 
    THEN
      ASSIGN(arq,prn)
  ELSE
    ASSIGNCRT (arq);
  {$I-}
  REWRITE (arq);
  {$I+}
  IF IORESULT <> 0
    THEN
      BEGIN
        GOTOXY (10,24);
      WRITE (erro de abertura de arquiv);
    END
  ELSE
    BEGIN
      GOTOXY (10,10);
      {$I-}
      WRITELN (arq,sada rpida via rotina CRT);
      {$I+]
      IF IORESULT <> 0
        THEN
        BEGIN
          GOTOXY (10,24);
          WRITE (erro de sad);
        END;
    CLOSE (arq);
  END;
  REPEAT
  UNTIL READKEY <> #0;
END.

KEYPRESSED - esta funo retorna verdadeira caso tenha sido pressionada 
alguma tecla. Est disponvel na unidade CRT. Sua sintaxe:
KEYPRESSED : BOOLEAN;
Vejamos um exemplo:
PROGRAM teste_keypressed;
USES CRT;
BEGIN
  REPEAT
  WRITE ($#);
  UNTIL KEYPRESSED;
END.

WINDOW - este procedimento permite que se defina a rea til do vdeo que 
ser utilizada. O default  a partir da coluna 1 e linha 1 at a coluna 80
e linha 25, para modo de 80 colunas, e coluna 1 e linha 1 a coluna 40 e 
linha 25, para o modo de 40 colunas, todas as funes e procedimentos utili-
zados aps o uso deste, tero como coordenadas as posies definidas pela
nova WINDOW. Sua sintaxe:
WINDOW (<x1>,<y1>,<x2>,<y2> : BYTE);
  Onde x1, y1 so as coordenadas coluna e linha incial, ou seja, o canto 
superior esquerdo  x2, y2, as coordenadas de coluna e linha final, ou o 
canto inferior direito, no caso destas variveis estarem fora dos parmetros
vlidos, o procedimento simplesmente no ser executado no sendo enviada
nenhuma mensagem de erro.
Vejamos um exemplo:
PROGRAM teste_window;
USES CRT;
VAR
  x1, y1, x2, y2 : BYTE;
  ch : CHAR;
BEGIN
  CLRSCR;
  REPEAT
    WINDOW (1,1,80,25);
    GOTOXY (1,1);
    WRITE (entre com a coluna inicial);
    READLN (x1);
    WRITE (entre com a linha inicial);
    READLN (y1);
    WRITE (entre com a coluna final );
    READLN (x2);
    WRITE (entre com a linha final );
    READLN (y2);
    CLRSCR;
    GOTOXY (10,25);
    WRITE (pressione algo para outra window);
    WINDOW (x1,y1,x2,y2);
    REPEAT
      WRITE (CHR(RANDOM(223) + 32));
    UNTIL KEYPRESSED;
    ch := READKEY;
    WINDOW (1,1,80,25);
    GOTOXY (10,25);
    WRITE (deseja nova window [S/N]???);
  UNTIL UPCASE (READKEY) <> S;
  CLRSCR;
END.

WHEREX - esta funo faz parte da unidade CRT, e retorna a coordenada X 
referente  posio atual do cursor em relao  WINDOW, ou seja, a coluna
em que se encontra o cursor. Sua sintaxe:
WHEREX : BYTE;

WHEREY - esta funo faz parte da unidade CRT, e retorna a coordenada Y
referente  posio atual do cursor em relao  WINDOW, ou seja, a linha 
em que se encontra o cursor.Sua sintaxe:
WHEREY : BYTE;
Vejamos um exemplo destas funes:
PROGRAM teste_wherex_y;
USES CRT;
BEGIN
  CLRSCR;
  WRITELN (a posio do cursor antes est, mensagem  ,WHEREX,,,WHEREY);
  WINDOW (10,10,70,20);
  WRITELN (a posio do cursor antes est,mensagem ,WHEREX,,,WHEREY);
END.

  Podemos relatar que aps a execuo deste programa, apesar do cursor 
aparecer em pontos diferentes do vdeo, as coordenas que aparecem na mensagem
so as mesmas, isto porque as coordenadas so relativas  WINDOW ativa.

DELLINE - este procedimento eliminha a linha em que estiver posicionado o 
cursor, fazendo o rolamento das linhas que estiverem abaixo desta e incre-
mentando uma linha ao final do vdeo. a linha deletada no pode ser recu-
perada, tanto a linha deletada como a linha que for introduzida respeitam 
a WINDOW ativa no momento. Este procedimento pertence  unidade CRT, e sua 
sintaxe :
DELLINE;

INSLINE - este procedimento permite a insero de uma linha na posio 
onde se encontra o cursor, fazendo o rolamento das linhas que estiverem a-
baixo da posio do cursor. A ltima linha  perdida, e no pode ser mais
recuperada. Tanto a linha que for includa quanto a que for eliminada obe-
decem s coordenadas da WINDOW que estiver ativa no momento da execuo 
da rotina. Este procedimento pertence  unidade CRT, e sua Sintaxe :
INSLINE;
Vejamos um exemplo que abrange essas duas ltimas rotinas:
PROGRAM teste_dellinha_inslinha;
USES CRT;
BEGIN
  CLRSCR;
  GOTOXY (1,1);
  WRITE (primeira linha da tel);
  GOTOXY (61,11);
  WRITE (fora da janel);
  GOTOXY (1,25);
  WRITE (ltima linha da tel);
  WINDOW (1,10,60,20);
  GOTOXY (1,1);
  WRITELN (linha 1);
  WRITELN (linha 2);
  WRITELN (linha 3);
  WRITELN;
  WRITE (tecle <enter> para deletar a linha 2);
  READLN;
  GOTOXY (1,2);
  DELLINE;
  GOTOXY (1,5);
  WRITE (tecle <enter> para inserir uma nov,linh);
  READLN;
  GOTOXY (1,2);
  INSLINE;
  READLN;
  WINDOW (1,1,80,25);
  CLRSCR;
END.

TEXTCOLOR - este procedimento permite que selecionemos a cor do texto que 
aparecer no vdeo, sendo as cores representadas por valores numricos inteiros
que variam de 0 a 15, que correspondendem s seguintes cores:
0 - preto
1 - azul
2 - verde
3 - ciano
4 - vermelho
5 - magenta
6 - marrom
7 - cinza claro
8 - cinza escuro
9 - azul claro
10 - verde claro
11 - ciano claro
12 - vermelho claro
13 - magenta claro
14 - amarelo
15 - branco
  Alm dessas 16 cores disponveis, podemos somar a qualquer uma delas 
128 para que o texto fique piscante, na verdade o que este procedimento faz
 setar o bits de 0 at 3 para as cores propriamente ditas, e mais o bit 7
para o piscante do byte de atributo do modo texto. Sua sintaxe:
TEXTCOLOR (<cor> BYTE);

TEXTBACKGROUND - este procedimento permite selecionar a cor de fundo, que  
representada por um valor numrico  inteiro que pode variar de 0 at 7, 
corespondendo s seguintes cores:
0 - preto
1 - azul
2 - verde
3 - ciano
4 - vermelho
5 - magenta
6 - marrom
7 - cinza claro
  Este procedimento seta os bits 4, 5 e 6 do byte de atributo no modo texto.
Sua sintaxe:
TEXTBACKGROUND (<cor> : BYTE);
Vejamos um exemplo:
PROGRAM teste_textcolor_background;
USES CRT;
VAR
  texto, fundo : BYTE;
BEGIN
  CLRSCR;
  FOR texto := 0 TO 15 DO
    FOR fundo := 0 TO 6 DO
      BEGIN
        GOTOXY ((fundo + 1)*9,texto + 1);
        TEXTCOLOR (texto);
        TEXTBACKGROUND (fundo);
        WRITE (fundo :4,texto :4);
      END;
  WRITELN;
  TEXTCOLOR (7);
  TEXTBACKGROUND (0);
  WRITELN (normal);
  TEXTCOLOR (7 + 128);
  TEXTBACKGROUND (0);
  WRITELN (normal piscant);
  TEXTCOLOR (0);
  TEXTBACKGROUND (7);
  WRITELN (revers);
  TEXTCOLOR (0 + 128);
  TEXBACKGOUND (7);
  WRITELN (reverso piscant);
  TEXTCOLOR (7);
  TEXTBACKGROUND (0);
  READLN;
  CLRSCR;
END.

HIGHVIDEO - este procedimento est definido na unidade CRT e seleciona a 
cor de texto para alta intensidade. Sua sintaxe:
HIGHVIDEO;

LOWVIDEO - este procedimento seleciona o texto em baixa intesidade e est
definido na unidade CRT, sua Sintaxe:
LOWVIDEO;

NORMVIDEO - este procedimento est definido na unidade CRT, e permite que 
se retorne a mesma cor para o texto, da posio do cursor no momento em que 
foi carregado o programa. Sua sintaxe:
NORMVIDEO;
Vejamos um exemplo com esses ltimos comandos:
PROGRAM teste_norm_high_low_video;
USES CRT;
BEGIN
  CLRSCR;
  TEXTCOLOR (15);
  TEXGACKGROUND (0);
  WRITELN (texto em alta intensidade pel,TextColor);
  LOWVIDEO;
  WRITELN (texto em baixa intensidade(LOWVIDEO));
  HIGHVIDEO;
  WRITELN (texto em alta intensidade (HIGHVIDEO));
  NORMVIDEO;
  WRITELN (texto no modo normal (NORMVIDEO));
  READLN;
  CLRSCR;
END.  

TEXTMODE - este procedimento est definido na unidade CRT, e permite que 
selecionemos o modo de texto no qual desejamos trabalhar. Este modo  de-
terminado por um valor numrico que tem a seguinte equivalncia:
0 = 40x25 Adaptador colorido branco/preto
1 = 40x25 Adaptador colorido colorido
2 = 80x25 Adaptador colorido branco e preto
3 = 80x25 Adaptador colorido colorido
7 = 80x25 Adaptador monocromtico em branco/preto
256 = para EGA/VGA 43 ou 50 linhas
  Qualquer outro valor ser assumido o valor 3. Sua sintaxe:
Vejamos um exemplo:
PROGRAM teste_textemode;
USES CRT;
BEGIN 
  CLRSCR;
  WRITELN (modo normal);
  WRITELN (tecle <enter>);
  READLN;
  TEXTMODE (1);
  WRITELN (SUPER TEXT);
  WRITELN (tecle <enter>);
  READLN;
  TEXTMODE (3);
  CLRSCR;
END.

SOUND - este procedimento pertence  unidade CRT e permite disparar o alto-
falante interno, a uma frequncia especificada no parmetro. Deve ser utili-
zado em conjunto com o procedimento NOSOUND. Sua sintaxe:
SOUND (<hz> : WORD);

 NOSOUND - este procedimento pertence  unidade CRT e desativa a gerao 
des om causada pelo procedimento SOUND. Sua sintaxe:
NOSOUND;
Vejamos um exemplo:
PROGRAM teste_sound_nosound;
USES CRT;
VAR
  ch :CHAR;
  tempo : WORD;
FUNCTION letecla : WORD;
BEGIN
  REPEAT
    ch := UPCASE (READKEY);
    IF ch = +
      THEN
        IF tempo < 800
          THEN
            tempo := tempo + 50;
      IF ch = -
        THEN
         IF tempo > 50
            THEN
            tempo := tempo - 50;
      GOTOXY (67,10);
      WRITE (tempo : 3);
    UNTIL ch IN[Q,W,,R,T,Y,,,,P,[,,S,D,
                F,G,H,J, K,L,;,#39,#27];
      CASE ch OF
      Q : letecla := 500;
      W : letecla := 560;
       : letecla := 630;
      R : letecla := 710;
      T : letecla := 795;
      Y : letecla := 890;
       : letecla := 1000;
       : letecla := 1129;
       : letecla := 1260;
      P : letecla := 1415;
      [ : letecla := 1600;
       : letecla := 530;
      S : letecla := 595;
      D : letecla := 670;
      F : letecla := 750;
      G : letecla := 840;
      H : letecla := 945;
      J : letecla := 1060;
      K : letecla := 1190;
      L : letecla := 1335;
      ; : letecla := 1500;
      #39 : letecla := 1625;
      #27 : letecla := 0;
  END;
END;
BEGIN
  CLRSCR;
  GOTOXY (25,1);
  WRITE (piano digital);
  GOTOXY (25,4);
  WRITE (teclado do pian);
  GOTOXY (22,8);
  WRITE (q w e r t y u i o p []);
  GOTOXY (23,9);
  WRITE (a s d f g h j k l ;);
  GOTOXY (65,4);
  WRITE (FREQUNCI);
  GOTOXY (68,8);
  WRITE (+);
  GOTOXY (68,9);
  WRITE (-);
  GOTOXY (25,15);
  WRITE (tecle <esc> para sair);
  tempo := 200;
  REPEAT
    SOUND (letecla);
    DELAY (tempo);
    NOSOUND;
  UNTIL ch = #27;
END.
