Advertisement
jacknpoe

Algumas funções de janelas em Borland C para MS-DOS

Jul 22nd, 2015
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.20 KB | None | 0 0
  1. // ESTE ARQUIVO É A PARTE MAIS BAIXO NÍVEL DE UMA BIBLIOTECA DE BASE PARA BORLAND C++ RODANDO EM MS-DOS NO ANO DE 1997
  2. // ALGUMAS PECULIARIDADES DO CÓDIGO SE DEVEM AOS PADRÕES DO C++ DA ÉPOCA, À BIBLIOTECA BORLAND E À OTIMIZAÇÕES ESPERADAS
  3. // NÃO ACONSELHO COMPILAR OU RODAR, EXCETO EM UMA CÓPIA DE UMA VIRTUAL MACHINE RODANDO MS-DOS
  4. // LHE FALTAM OS #INCLUDES NECESSÁRIOS E UMA MAIN()
  5. // PODE SER QUE SEJA NECESSÁRIO COMPILAR EM UMA VIRTUAL MACHINE MAS RODAR EM UM EMULADOR
  6. // RICARDO ERICK REBÊLO (JACKNPOE), 24/07/2015
  7.  
  8.  
  9. // verificar os #includes para:
  10. // union REGS e int86() (se utilizar ini_tela() ou pisca())
  11. // delay (se você não retirar a opção de animação em "cortina")
  12.  
  13.  
  14. // verifique seu compilador e defina BYTE como um tipo de 8 bits
  15. #define BYTE unsigned char
  16.  
  17. // localização do buffer da placa de vídeo (apenas no modo 0x3 (texto 80x25 16 cores))
  18. BYTE *buf_tela = (BYTE *) 0xb8000000L;
  19.  
  20. // estrutura usada para uso dos registros do processador
  21. union REGS regs;
  22.  
  23. // tabela de conversão das 16 cores em suas sombras (a cor é o índice)
  24. //                    0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15   // cor original
  25. char tab_sombra[] = { 0, 0, 8, 8, 0, 0, 0, 8, 0, 1, 2, 3, 4, 5, 6, 7}; // cor sombra
  26.  
  27.  
  28. //*********************************************
  29. // coloca a tela em modo texto 80x25 16 cores
  30. // utiliza o método int86 (interrupção para 8086)
  31. // a função de interrupção utilizada é responsabilidade da placa de vídeo
  32. // se você comentar esta função, verifique se seu #include é necessário, senão comente-o (verifique também pisca())
  33.  
  34. void ini_tela(void)
  35. {
  36.     regs.h.ah= 0;
  37.     regs.h.al= 0x3;
  38.     int86( 0x10, &regs, &regs);
  39. }
  40.  
  41. //*********************************************
  42. //  tipo: 0: cores intensas  1: algumas cores piscam
  43. // a função de interrupção utilizada é responsabilidade da placa de vídeo
  44. // você precisa executar pisca( 0) para habilitar as cores intensas necessárias para sombra() funcionar
  45. // se você comentar esta função, verifique se seu #include é necessário, senão comente-o (verifique também ini_tela()
  46.  
  47. void pisca( char tipo)
  48. {
  49.     regs.x.ax = 0x1003;
  50.     regs.h.bl = tipo;
  51.     int86( 0x10, &regs, &regs);
  52. }
  53.  
  54.  
  55. //*********************************************
  56. // coloca um caracter em uma localização X,Y
  57.  
  58. void direct_char( char x, char y, BYTE caracter)
  59.     { *(buf_tela + x*2 + y*160) = caracter; }
  60.  
  61. //*********************************************
  62. // modifica os atributos de cores em X,Y
  63.  
  64. void direct_attr( char x, char y, BYTE atributo)
  65.     { *(buf_tela + x*2 + y*160 + 1) = atributo; }
  66.  
  67. //*********************************************
  68. // constrói um retângulo de x1,y1 a x2,y2 com o caracter "pr" e cor "at"
  69.  
  70. void retangulo( char x1, char y1, char x2, char y2, BYTE pr, BYTE at)
  71. {
  72.     char x, y;
  73.  
  74.     for( y=y1; y<=y2; y++)
  75.         for( x=x1; x<=x2; x++)
  76.         {
  77.             direct_char( x, y, pr);
  78.             direct_attr( x, y, at);
  79.         }
  80. }
  81.  
  82. //*********************************************
  83. // muda a cor de um retângulo de x1,y1 a x2,y2 e cor "at"
  84.  
  85. void retangulo_c( char x1, char y1, char x2, char y2, BYTE at)
  86. {
  87.     char x, y;
  88.  
  89.     for( y=y1; y<=y2; y++)
  90.         for( x=x1; x<=x2; x++)
  91.         {
  92.             direct_attr( x, y, at);
  93.         }
  94. }
  95.  
  96. //*********************************************
  97. // escurece (como uma sombra) o retângulo de x1,y1 a x2,y2
  98. // para esta função funcionar, você precisa, utilizar pisca( 0) para habilitar as cores intensas
  99. // se você comentar esta função, verifique se a função pisca e seu #include são necessários, senão comente-os
  100.  
  101. void sombra( char x1, char y1, char x2, char y2)
  102. {
  103.     char x, y, frente, fundo;
  104.     BYTE temp;
  105.  
  106.     for( y=y1; y<=y2; y++)
  107.         for( x=x1; x<=x2; x++)
  108.         {
  109.             temp = *(buf_tela + x*2 + y*160 + 1);
  110.             fundo = tab_sombra[temp/16];
  111.             frente = tab_sombra[temp%16];
  112.             temp = frente + fundo * 16;
  113.             direct_attr( x, y,temp);
  114.         }
  115. }
  116.  
  117. //*********************************************
  118. // Escreve uma string em X,Y
  119.  
  120. void put_string( char x, char y, char *string)
  121. {
  122.     int contador1, contador2=0;
  123.  
  124.     contador1 = x*2 + y*160;
  125.  
  126.     while( string[contador2] != 0)
  127.     {
  128.         *(buf_tela + contador1) = string[contador2];
  129.         contador2++;
  130.         contador1+=2;
  131.     }
  132. }
  133.  
  134. //*********************************************
  135. // cria uma janela com canto esquerdo superior em x1,y1
  136. // de tamanho x2,y2, com cor at para o corpo da janela,
  137. // cor tt para o título, opcionalmente animada em tp * 150 milisegundos,
  138. // string de título "st" com opção de gerar sombra um caracter além do quadro
  139. //
  140. //  char x1  = X do canto esquerdo superior (contando título)
  141. //  char y1  = Y do canto esquerdo superior (contando título)
  142. //  char x2  = largura (sem contar título, claro)
  143. //  char y2  = altura  (sem contar o título)
  144. //  BYTE at  = cores de caracter e fundo para o corpo da "janela"
  145. //  BYTE tt  = cores de caracter e fundo para o título da "janela"
  146. //  char tp  = tempo total da animação (em unidades de 150 milisegundos) 0 para instantâneo
  147. //  char *st = string com o título do quadro
  148. //  char sb  = se 1 gera sombra após o quadro, se 0 não
  149.  
  150. void cortina( char x1, char y1, char x2, char y2, BYTE at, BYTE tt, char tp, char *st, char sb)
  151. {
  152.     char y;
  153.     int pausa;
  154.  
  155.     pausa = 150*tp/(y2+1);
  156.     x2 = x1+x2-1;
  157.     y2 = y1+y2-1;
  158.     y1--;
  159.  
  160.     retangulo( x1, y1, x2, y1, ' ', tt);
  161.     put_string( x1+1, y1, st);
  162.     if( sb != 0) sombra( x1+2, y1+1, x2+2, y1+1);
  163.             // se não quiser sombra, comente a função sombra() e verifique um #include e se pode comentar também pisca()
  164.     delay( pausa);  // se excluir a animação desta função, verifique se não há mais a necessidade de #include
  165.  
  166.     for( y=y1+1; y<=y2; y++)
  167.     {
  168.         retangulo( x1, y, x2, y, ' ', at);
  169.         if( sb != 0) sombra( x1+2, y+1, x2+2, y+1);
  170.                     // se não quiser sombra, comente a função sombra() e verifique um #include e se pode comentar também pisca()
  171.         delay( pausa);  // se excluir a animação desta função, verifique se não há mais a necessidade de #include
  172.     }
  173. }
  174.  
  175.  
  176. // EXEMPLO:
  177. //
  178. // pisca( 0);  // habilita cores intensas, necessárias para a sombra)
  179. // cortina( 21, 9, 37, 3, 144, 31, 3, "Erro de Disco", 1);  // cria uma janela com animação
  180. // put_string( 23, 10, "Problemas ao ler ou gravar dados!");  // acrescenta um texto na janela
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement