module ansi interface (input, output);

{Archivo Practicas\pr04\units\ModuleANSI\ANSI.pas
 Objeto  Crear un conjunto de operaciones equivalentes a las que tiene la
         unit CRT de BORLAND con los caracteres de escape ANSI.
         GotoXY(columna, fila)   Esc[fila;ColumnaH
         ClrScr                  Esc[HEsc[J
                      tambien    Esc[2J
         Subir cursor n filas    Esc[nA
         Bajar cursor n filas    Esc[nB
         Derec cursor n colum    Esc[nC
         Izqui cursor n colum    Esc[nD
         Memorizar columna fila  Esc[s
         Volver a columna fila   Esc[u
         Borrar hasta fin fila   Esc[K
         Redefinir tecla Fi      Esc[0;tecla,"cadena",13p

Nota	   Debe estar instalado el driver de pantalla ANSI
	      En W98 se hace en CONFIG.SYS agregando la linea
		     DEVICE=C:\WINDOWS\COMMAND\ANSI.SYS
         En NT se instala en el fichero config.nt asociado al entorno.
	      En los terminales WISE ya se ha instalado.
}
export ansi=(GotoXY, LeeXY, IrXY, Sube, Baja, Izda, Dcha,
                ClrScr, ClrEos, ClrEol);

procedure GotoXY(Columna, Fila: integer);
procedure LeeXY; (* Almacena posicion del cursor *)
procedure IrXY;  (* Recoloca cursor en posicion almacenada *)
procedure Sube(nFilas:integer);
procedure Baja(nFilas:integer);
procedure Izda(nColumnas:integer);
procedure Dcha(nColumnas:integer);
procedure ClrScr;
procedure ClrEos;
procedure ClrEol;  (* Borra hasta fin de linea             *)
                   (* y pasa al 1§ de fila la siguiente    *)


end.


module ansi implementation;

const esc = chr(27) + '[';


procedure ClrScr;  (* Borra TODA la pantalla *)
begin
   write(esc, 'H', esc, 'J')
end;

procedure ClrEos;  (* Borra desde el cursor hasta fin de pantalla *)
begin
  write(esc, '2J');
end;

procedure GotoXY; (* Situar el cursor *)
begin
  Write(esc, Fila, ';', Columna, 'H')
end;

procedure LeeXY; (* Almacena posicion del cursor *)
begin
  write(esc, 's')
end;

procedure IrXY;  (* Recoloca cursor en posicion almacenada *)
begin
  write(esc, 'u')
end;


procedure Sube;         (* Subir n Filas *)
begin
  write(esc, nFilas, 'A');
end;

procedure Baja;         (* Bajar n Filas*)
begin
  write(esc, nFilas, 'B');
end;

procedure Izda;      (* Retrocede n Columnas *)
begin
  write(esc, nColumnas, 'D');
end;

procedure Dcha;      (* Avanza n Columnas  *)
begin
  write(esc, nColumnas, 'C');
end;


procedure ClrEol;                       (* Borra hasta fin de linea *)
begin                                   (* y pasa a la siguiente    *)
  write(esc, 'K');
end;



procedure VerCF(VAR Columna, Fila:integer); (* Lee posicion *)
begin
  write(esc,fila, ';', columna, 'R');

end;

end.
