commit 985e2b64cca6cadba3b79c98694358c854d8a08e
Author: jdg <jd@infdj.com>
Date:   Wed Sep 8 21:23:56 2021 +0200

    First commit 20/09/1997

diff --git a/BONITRON.CPP b/BONITRON.CPP
new file mode 100644
index 0000000..9132ad2
--- /dev/null
+++ b/BONITRON.CPP
@@ -0,0 +1,243 @@
+ /************************************************************************\
+|*                                                                        *|
+|* Programa para poner bonito el c�digo fuente de los otros programas...  *|
+|*                                                                        *|
+|* Jos� David Guill�n                                                     *|
+|*                                                                        *|
+|* Historia                                                               *|
+|*          Hay veces que empiezo a escribir un programa que creo que no  *|
+|*          me va a servir para nada y cuando me doy cuenta lo estoy re-  *|
+|*          escribiendo o adaptandolo, pero es un Spagetti-Code tan       *|
+|*          grande que pierdo un buen rato sangrandolo. Bien, pues se     *|
+|*          acabo el 'frotar' ya tengo 'bonitron'....                     *|
+|*                                                                        *|
+ \************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+// los corchetes son '{' y  '}'
+#define DESPLAZAMIENTO_CORCHETE         2
+// Considero etiquetas a los 'case' de switch();
+#define DESPLAZAMIENTO_ETIQUETA        12
+
+// Mayor longitud de palabra compleja
+#define PALABRA_MAXIMA                 14
+
+void main( int argc, char *argv[] )
+{
+ FILE *ORIGEN, *DESTINO;
+ int i;
+ int charR, OcharR;
+ int NivelActual, NivelEtiqueta;
+ char DetectadoEOL,
+      DetectadoComm;
+ char BufferPalabra[PALABRA_MAXIMA + 1];
+
+
+ if ( argc != 3 )
+ {
+  printf( "\nError, n� de parametros erroneo\n" );
+  return;
+ }
+
+ if ( ( ORIGEN  = fopen( argv[1], "rt" ) ) == NULL ||
+      ( DESTINO = fopen( argv[2], "wt" ) ) == NULL   )
+ {
+  printf( "\nError abriendo el origen o destino\n" );
+  return;
+ }
+
+ NivelEtiqueta = 0;
+ NivelActual   = 0;
+ DetectadoEOL  = 0;
+ DetectadoComm = 0;
+ BufferPalabra[0] = '\0';
+
+ charR = 0;
+ while ( !feof(ORIGEN) )
+ {
+  OcharR = charR;
+  charR  = fgetc(ORIGEN);
+
+  switch( charR )
+  {
+   // Cuidadin con esto
+   case '\n':
+   case '\r':
+             BufferPalabra[0] = '\0';
+
+             DetectadoComm = 0;
+
+             DetectadoEOL = 1;
+
+             fputc( charR, DESTINO );
+             break;
+   case  '=':
+   case  '<':
+   case  '>':
+   case  '!':
+   case  '+':
+   case  '-':
+   case  '/':
+   case  '*':
+   case  '^':
+   case  ']':
+   case  ')':
+   case  '[':
+   case  '(':
+   case  '"':
+             // Si antes no hab�a un espacio, ni un caracter de los anteriores
+             // me parece mas est�tico un espacio antes.
+             if ( OcharR != ' ' &&
+                  OcharR != '=' && OcharR != '*' &&
+                  OcharR != '<' && OcharR != '^' &&
+                  OcharR != '>' && OcharR != '[' &&
+                  OcharR != ']' && OcharR != '(' &&
+                  OcharR != '!' && OcharR != ')' &&
+                  OcharR != '+' && OcharR != '-' &&
+                  OcharR != '/'                     )
+             {
+               fputc( ' ', DESTINO );
+             }
+             fputc( charR, DESTINO );
+             DetectadoEOL = 0;
+             break;
+   // Veamos las etiquetas
+   case  ':':
+             if ( !DetectadoComm )
+             {
+              if ( !DetectadoEOL )
+                fputc( 13, DESTINO );
+              NivelActual   += DESPLAZAMIENTO_ETIQUETA;
+              NivelEtiqueta += DESPLAZAMIENTO_ETIQUETA;
+              fputc( ':', DESTINO );
+             }
+             DetectadoEOL = 0;
+             break;
+   // Corchetes de entrada
+   case '{':
+            if ( !DetectadoComm )
+            {
+             if ( !DetectadoEOL )
+               fputc( 13, DESTINO );
+             for ( i = 0; i < NivelActual; i++ )
+               fputc( ' ', DESTINO );
+             fputc( '{', DESTINO );
+             NivelActual+=DESPLAZAMIENTO_CORCHETE;
+            }
+            DetectadoEOL = 0;
+            break;
+   // Corchetes de Salida
+   case '}':
+            if ( !DetectadoComm )
+            {
+             if ( !DetectadoEOL )
+               fputc( 13, DESTINO );
+             NivelActual-=DESPLAZAMIENTO_CORCHETE;
+             for ( i = 0; i < NivelActual; i++ )
+               fputc( ' ', DESTINO );
+             fputc( '}', DESTINO );
+            }
+            DetectadoEOL = 0;
+            break;
+   case ';':
+            if ( OcharR == '}' )
+             fputc( ' ', DESTINO );
+            fputc( ';', DESTINO );
+            DetectadoEOL = 0;
+            break;
+   // Salvamos el EOL, para los corchetes
+   case ' ':
+            // Nos saltamos todos los espacios blancos
+           if ( !DetectadoEOL )
+            fputc( charR, DESTINO );
+           BufferPalabra[0] = '\0';
+           break;
+
+   // No sabemos procesar el simbolo
+   default:
+           if ( NivelActual < 0 )
+            NivelActual = 0;
+           PROCESA_CARACTER_POR_DEFECTO:
+           if ( DetectadoEOL )
+             for ( i = 0; i < NivelActual/*+DESPLAZAMIENTO_CORCHETE*/; i++ )
+               fputc( ' ', DESTINO );
+           DetectadoEOL = 0;
+
+           switch ( OcharR )
+           {
+             case  '=':
+             case  '<':
+             case  '>':
+             case  '!':
+             case  '+':
+             case  '-':
+             case  '/':
+             case  '*':
+             case  '^':
+             case  ']':
+             case  '[':
+             case  '(':
+             case  ')':
+                 // Si el carater actual no es ninguno de estos, ni un espacio
+                 // quedaria muy bien un espacio detras de aqui...
+             if ( charR != ' ' &&
+                  charR != '=' && charR != '*' &&
+                  charR != '<' && charR != '^' &&
+                  charR != '>' && charR != '[' &&
+                  charR != ']' && charR != '(' &&
+                  charR != '!' && charR != ')' &&
+                  charR != '+' && charR != '-' &&
+                  charR != '/'                     )
+             {
+               fputc( ' ', DESTINO );
+             }
+             fputc( charR, DESTINO );
+             break;
+            default:
+              fputc( charR, DESTINO );
+           }
+
+           // Procesado de palabras complejas
+           i = strlen(BufferPalabra);
+           BufferPalabra[ i ] = (char)charR;
+           BufferPalabra[ i+1] = '\0';
+
+           // Detectado 'break'
+           if ( strcmp( BufferPalabra, "break;" ) == 0 )
+           {
+            NivelEtiqueta -= DESPLAZAMIENTO_ETIQUETA;
+            if ( NivelEtiqueta >= 0 )
+              NivelActual   -= DESPLAZAMIENTO_ETIQUETA;
+            fputc( 13, DESTINO );
+
+            BufferPalabra[0] = '\0';
+           }
+
+           if ( strcmp( BufferPalabra, "//" ) == 0 )
+           {
+            BufferPalabra[0] = '\0';
+            DetectadoComm    = 0;
+           }
+
+           if ( strlen( BufferPalabra ) == PALABRA_MAXIMA )
+             BufferPalabra[0] = '\0';
+
+           break;
+  }
+
+
+ }
+
+
+
+ fclose( ORIGEN  );
+ fclose( DESTINO );
+
+}
+
+
+
+
+
diff --git a/BONITRON.EXE b/BONITRON.EXE
new file mode 100644
index 0000000..0c3e5f5
Binary files /dev/null and b/BONITRON.EXE differ
diff --git a/CDA.IDM b/CDA.IDM
new file mode 100644
index 0000000..3113975
Binary files /dev/null and b/CDA.IDM differ
diff --git a/I1.IDM b/I1.IDM
new file mode 100644
index 0000000..aa02bb2
Binary files /dev/null and b/I1.IDM differ
diff --git a/INDEXM.CPP b/INDEXM.CPP
new file mode 100644
index 0000000..cb1da6f
--- /dev/null
+++ b/INDEXM.CPP
@@ -0,0 +1,978 @@
+ /**************************************************************************\
+|*                                                                          *|
+|* Indexador de Medios 1.0d                                                 *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+|*                                                                          *|
+ \**************************************************************************/
+
+#include <dir.h>
+#include <conio.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dos.h>
+
+#define NUM_LINEAS  20
+
+char Buffer[80];
+
+typedef struct
+{
+ char FA[1024];
+ long NumArchivos;
+ int  NumDirectorios;
+} CABECERA_IM;
+
+typedef struct
+{
+// unsigned char Nivel;           // Nivel actual en el que me encuentro
+ char ff_attrib;       /* attribute found */
+ int  ff_ftime;        /* file time */
+ int  ff_fdate;        /* file date */
+ long ff_fsize;        /* file size */
+ char ff_name[13];     /* found file name */
+ char nivel;
+} MINDEX;
+
+typedef struct
+{
+ char Nivel;
+ long PosDirectorio;
+ char ContraidoExpandido;
+} MDIREC;
+
+//MINDEX *MIndex;
+
+void formatea_u_long( unsigned long Numero, char *Inter_Chg);
+void GuardaMedio( char *DesdeDonde, unsigned char Nivel );
+int ConstruyeIndice( char *DesdeDonde, char *NArchivo );
+void Que_Color(void);
+
+
+MINDEX MI;
+MDIREC MD, far *Directorios;
+CABECERA_IM CabIM;
+
+FILE * HF, * HD;
+
+void GuardaMedio( char *TiposArchivos, unsigned char Nivel )
+{
+ struct ffblk ffblk;
+ int done;
+
+ // Guardamos toda la informaci�n desde el directorio Actual.
+ done = findfirst(TiposArchivos,&ffblk, FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_DIREC | FA_ARCH );
+ while (!done)
+ {
+   MI.ff_attrib= ffblk.ff_attrib;
+   MI.ff_ftime = ffblk.ff_ftime;
+   MI.ff_fdate = ffblk.ff_fdate;
+   MI.ff_fsize = ffblk.ff_fsize;
+   sprintf( MI.ff_name, "%s", ffblk.ff_name   );
+      MI.nivel = Nivel;
+//////////////////////////////////////////////////////////////////////////
+gotoxy( Nivel+1, wherey() );
+cprintf( "%s [%d]\r\n", ffblk.ff_name, Nivel );
+//////////////////////////////////////////////////////////////////////////
+   CabIM.NumArchivos++;
+   fwrite( &MI, sizeof(MINDEX), 1, HF );
+
+   if ( (ffblk.ff_attrib&FA_DIREC) && MI.ff_name[0] != '.' )
+    {
+     MD.PosDirectorio = CabIM.NumArchivos;
+     MD.Nivel = Nivel;
+     CabIM.NumDirectorios++;
+     fwrite( &MD, sizeof(MD), 1, HD );
+     if ( !chdir( ffblk.ff_name ) )
+     {
+      GuardaMedio( TiposArchivos, Nivel+1 );
+      chdir( ".." );
+     }
+    }
+   done = findnext(&ffblk);
+ }
+}
+
+char PathActual[512];
+
+int ConstruyeIndice( char *DesdeDonde, char *NArchivo )
+{
+ FILE *HF1, *HF2, *HFf;
+ struct ffblk ffblk;
+ long i;
+ char buffer[80];
+
+ int  CurrDisk;
+
+ // Creamos dos ficheros temporales...
+ if ( (HF1 = fopen( "files.tmp", "wb" )) == NULL )
+  return -1;
+ if ( (HF2 = fopen( "direc.tmp", "wb" )) == NULL )
+  return -1;
+
+ CurrDisk = getdisk();
+ getcurdir( 0, PathActual );
+
+ // Recorremos todo el "medio" guardando una especie de copia de la FAT.
+ setdisk( ( DesdeDonde[0] - 'A' ) );
+ chdir(DesdeDonde);
+ CabIM.NumDirectorios= 0;
+ CabIM.NumArchivos   = 0;
+
+ sprintf( buffer, "%c:\\*.*", DesdeDonde[0] );
+
+ findfirst(buffer,&ffblk, FA_LABEL );
+ sprintf( MI.ff_name, "%s", ffblk.ff_name );
+ MI.ff_name[8] = ffblk.ff_name[9];
+ MI.ff_name[9] = ffblk.ff_name[10];
+ MI.ff_name[10] = ffblk.ff_name[11];
+ MI.ff_name[11] = '\0';
+
+ MI.ff_attrib= ffblk.ff_attrib;
+ MI.ff_ftime = ffblk.ff_attrib;
+
+ MI.nivel = 0;
+
+     MD.PosDirectorio = 0;
+     MD.Nivel = 0;
+     MD.ContraidoExpandido = 1;
+     fwrite( &MD, sizeof(MD), 1, HF2 );
+     fwrite( &MI, sizeof(MI), 1, HF1 );
+
+ MD.ContraidoExpandido = 0;
+ HF = HF1; HD = HF2;
+ GuardaMedio( "*.*", 1 );
+
+ CabIM.NumDirectorios ++;
+ MD.PosDirectorio = -1;
+ MD.Nivel = 0;
+ MD.ContraidoExpandido = 0;
+
+ fwrite( &MD, sizeof(MD), 1, HF2 );
+
+ CabIM.NumArchivos++;
+ MI.ff_name[8] = ffblk.ff_name[9];
+ MI.ff_name[9] = ffblk.ff_name[10];
+ MI.ff_name[10] = ffblk.ff_name[11];
+ MI.ff_name[11] = '\0';
+
+ MI.ff_attrib= ffblk.ff_attrib;
+ MI.ff_ftime = ffblk.ff_attrib;
+
+ MI.nivel = 0;
+
+ fwrite( &MI, sizeof(MI), 1, HF1 );
+
+ fclose( HF1 );
+ fclose( HF2 );
+
+ chdir(PathActual);
+ setdisk(CurrDisk);
+
+
+ if ( (HF1 = fopen( "files.tmp", "rb" )) == NULL )
+  return -1;
+ if ( (HF2 = fopen( "direc.tmp", "rb" )) == NULL )
+  return -1;
+ if ( (HFf = fopen( NArchivo, "wb" )) == NULL )
+  return -1;
+
+ // Fusionamos los dos archivos en uno
+ fwrite( &CabIM, sizeof(CabIM), 1, HFf );
+
+
+ // Directorios
+ for ( i = 0; i <= CabIM.NumDirectorios; i++ )
+ {
+     fread( &MD, sizeof(MD), 1, HF2 );
+     fwrite( &MD, sizeof(MD), 1, HFf );
+ }
+ // Archivos
+ for ( i = 0; i <= CabIM.NumArchivos; i++ )
+ {
+     fread( &MI, sizeof(MI), 1, HF1 );
+     fwrite( &MI, sizeof(MI), 1, HFf );
+ }
+
+ fclose( HFf );
+ fclose( HF1 );
+ fclose( HF2 );
+
+
+ return 0;
+}
+
+
+void DibujaPantalla(void)
+{
+         //123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-
+ clrscr();
+// textbackground(BLUE);
+ textbackground( BLACK );
+
+ textcolor(LIGHTCYAN);
+ cprintf( "-x������������������������Ŀ  Nombre           Tama�o � Nombre           Tama�o " );
+ cprintf( "                           � ���������������������������������������������������" );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "�x����������������������������������������������������������������������������Ŀ" );
+ cprintf( "�                                                                              �" );
+ cprintf( "��������������������������������������������������������������������������������" );
+
+ textcolor( YELLOW );
+ gotoxy( 31 , 1 ); cprintf( "Nombre           Tama�o" );
+ gotoxy( 57,  1 ); cprintf( "Nombre           Tama�o" );
+
+ textbackground( RED );
+ gotoxy(  2 , 1 ); cprintf( "x" );
+ gotoxy(  2, 22 ); cprintf( "x" );
+
+// textbackground(BLUE);
+ textbackground( BLACK );
+
+};
+
+typedef struct
+{
+ char Directorios;
+ char Ruta;
+
+} CONFIG;
+
+CONFIG config;
+
+void MuestraDirectorio( int Row, int DirMuestra, char como );
+void ContraeExpandeRama( MDIREC far *DesdeAqui, char ContraeExpande );
+int  AvanzaRetrocede( int PuntoInicio, char RetrocedeAvanza );
+void MuestraDirectorios( long DirInicio );
+void LeeDir(void);
+void ReconstruyeDirectorio( int Nivel );
+
+void MuestraArchivo( int RowFisica, int PosArch, char como );
+void MuestraArchivos( long CurrTrnDir );
+
+
+FILE *HFf;
+
+void main(void)
+{
+ int ok, i;
+ int OldNivel;
+
+ DibujaPantalla();
+/*
+ window(2, 2, 25, 21);
+ ConstruyeIndice( "I:\\", "CDa.idm" );
+ window(1, 1, 80, 25);
+ return;*/
+ config.Directorios = 1;
+ config.Ruta        = 1;
+
+ if ( ( HFf = fopen( "CDa.idm", "rb" ) ) != NULL )
+ {
+
+ long CurrRowDir;
+ long  CurrTrnDir, OldCurrTrnDir, IniTrnDir;
+ long CurrTrnArch, CurrRowArch;
+
+ LeeDir();
+
+ CurrRowDir = 0;
+ CurrTrnDir = 0;
+ OldCurrTrnDir = 0;
+ IniTrnDir = 0;
+
+ // Construye el directorio actual
+
+ char VentanaActual = 1;
+
+ ok = 0;
+
+ if ( config.Directorios )
+ {
+  MuestraDirectorios( CurrTrnDir );
+  MuestraDirectorio( CurrRowDir, CurrTrnDir, 1 );
+ }
+
+ if ( config.Ruta )
+ {
+   sprintf( PathActual, "[%s]\\", MI.ff_name );
+
+   textcolor( YELLOW );
+   gotoxy( 2, 23 ); cprintf( "                                                                              " );
+   gotoxy( 2, 23 ); cprintf( "%s", PathActual );
+ }
+
+ CurrTrnArch = CurrTrnDir+1;
+ CurrRowArch = 0;
+
+ MuestraArchivos( CurrTrnArch );
+
+ do {
+  if ( kbhit() )
+  {
+   if ( config.Directorios && VentanaActual == 1 )
+      MuestraDirectorio( CurrRowDir, CurrTrnDir, 0 );
+   else
+      MuestraArchivo( CurrRowArch, CurrTrnArch+1, 0 );
+
+   switch( getch() )
+   {
+    case  9:
+            if ( config.Directorios )
+            {
+             VentanaActual++; if ( VentanaActual > 2 ) VentanaActual = 1;
+            }
+            switch( VentanaActual )
+            {
+             case 1:
+               fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnDir, SEEK_SET );
+               break;
+             case 2:
+               fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+               break;
+            }
+            fread( &MI, sizeof(MI), 1, HFf );
+            break;
+    case 13:
+     switch( VentanaActual )
+     {
+      case 1:
+             IniTrnDir = CurrTrnDir;
+             for ( i=0; i < CurrRowDir; i++ )
+                IniTrnDir = AvanzaRetrocede( IniTrnDir, -1 );
+             ContraeExpandeRama( &Directorios[CurrTrnDir], !Directorios[CurrTrnDir+1].ContraidoExpandido );
+             MuestraDirectorios( IniTrnDir );
+             break;
+      case 2:
+             // Retrocedemos / entramos en un directorio o mostramos las propiedades si es un archivo
+             if ( strcmp( MI.ff_name, ".." ) == 0 )
+             {
+              OldNivel = Directorios[CurrTrnDir].Nivel;
+              do {
+                   CurrRowDir--; if ( CurrRowDir < 0 )
+                   {
+                    CurrRowDir = 0;
+                    if ( CurrTrnDir != 0 )
+                    {
+                     movetext( 1, 2, 27, 20, 1, 3);
+                    }
+                    if ( config.Directorios && VentanaActual == 1 )
+                          MuestraDirectorio( CurrRowDir, CurrTrnDir, 0 );
+                   }
+                   CurrTrnDir = AvanzaRetrocede( CurrTrnDir, -1 );
+              } while( Directorios[CurrTrnDir].Nivel != (OldNivel-1) && Directorios[CurrTrnDir].Nivel != 0 );
+
+
+
+                     CurrTrnArch = Directorios[CurrTrnDir].PosDirectorio + 1;
+                     CurrRowArch = 0;
+                     MuestraArchivos( CurrTrnArch );
+
+                     if ( config.Ruta )
+                   {
+                    ReconstruyeDirectorio( CurrTrnDir );
+                    textcolor( YELLOW );
+                    gotoxy( 2, 23 ); cprintf( "                                                                              " );
+                    gotoxy( 2, 23 ); cprintf( "%s", PathActual, MI.ff_name );
+                   }
+
+  fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+  fread( &MI, sizeof(MI), 1, HFf );
+
+
+             } else {
+             // Penetramos en ese directorio...
+             // Si la rama no esta expandida, la expandimos
+              if ( MI.ff_attrib & FA_DIREC )
+              {
+               strcpy( Buffer, MI.ff_name );
+               if ( !Directorios[CurrTrnDir+1].ContraidoExpandido )
+               {
+                IniTrnDir = CurrTrnDir;
+                for ( i=0; i < CurrRowDir; i++ )
+                   IniTrnDir = AvanzaRetrocede( IniTrnDir, -1 );
+                ContraeExpandeRama( &Directorios[CurrTrnDir], !Directorios[CurrTrnDir+1].ContraidoExpandido );
+                MuestraDirectorios( IniTrnDir );
+               }
+               // Ahora avanzamos hasta alcanzar al directorio
+                   do {
+                    OldCurrTrnDir = CurrTrnDir;
+                    CurrTrnDir = AvanzaRetrocede( CurrTrnDir,  1 );
+                    if ( OldCurrTrnDir != CurrTrnDir )
+                    {
+                     CurrRowDir++;
+                     if ( CurrRowDir >= NUM_LINEAS )
+                     {
+                      CurrRowDir = NUM_LINEAS-1;
+                      movetext( 1, 3, 27, 21, 1, 2 );
+                     }
+                    }
+                   } while( strcmp( Buffer, MI.ff_name ) != 0 );
+
+
+                     CurrTrnArch = Directorios[CurrTrnDir].PosDirectorio + 1;
+                     CurrRowArch = 0;
+                     MuestraArchivos( CurrTrnArch );
+
+                    if ( config.Ruta )
+                    {
+                     ReconstruyeDirectorio( CurrTrnDir );
+                     textcolor( YELLOW );
+                     gotoxy( 2, 23 ); cprintf( "                                                                              " );
+                     gotoxy( 2, 23 ); cprintf( "%s", PathActual );
+                    }
+              } else {
+//               MuestraPropiedades();
+              }
+             }
+             break;
+     }
+     break;
+    case 27:
+     ok = 1;
+     break;
+    case  0:
+     switch( getch() )
+     {
+      case 64:
+            if ( config.Directorios )
+            {
+             VentanaActual++; if ( VentanaActual > 2 ) VentanaActual = 1;
+            }
+            switch( VentanaActual )
+            {
+             case 1:
+               fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnDir, SEEK_SET );
+               break;
+             case 2:
+               fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+               break;
+            }
+            fread( &MI, sizeof(MI), 1, HFf );
+            break;
+
+      case 72:
+           switch( VentanaActual )
+           {
+            case 1:
+                   CurrRowDir--; if ( CurrRowDir < 0 )
+                   {
+                    CurrRowDir = 0;
+                    if ( CurrTrnDir != 0 )
+                    {
+                     movetext( 1, 2, 27, 20, 1, 3);
+                    }
+                   }
+                   CurrTrnDir = AvanzaRetrocede( CurrTrnDir, -1 );
+
+                     CurrTrnArch = Directorios[CurrTrnDir].PosDirectorio + 1;
+                     CurrRowArch = 0;
+                     MuestraArchivos( CurrTrnArch );
+
+                   if ( config.Ruta )
+                   {
+                    ReconstruyeDirectorio( CurrTrnDir );
+                    textcolor( YELLOW );
+                    gotoxy( 2, 23 ); cprintf( "                                                                              " );
+                    gotoxy( 2, 23 ); cprintf( "%s", PathActual, MI.ff_name );
+                   }
+                   break;
+            case 2:
+                   OldCurrTrnDir = CurrTrnArch; OldNivel = MI.nivel;
+                   if ( CurrTrnArch == 1 ) break;
+                   do {
+                    CurrTrnArch--;
+                    fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+                    fread( &MI, sizeof(MI), 1, HFf );
+                   } while ( MI.nivel > OldNivel );
+                   if ( MI.nivel < OldNivel )
+                   {
+                    CurrTrnArch = OldCurrTrnDir;
+                    fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+                    fread( &MI, sizeof(MI), 1, HFf );
+                   } else {
+                    CurrRowArch--;
+                    if ( CurrRowArch < 0 )
+                    {
+                     CurrRowArch = 0;
+
+                     MuestraArchivos( CurrTrnArch );
+                    }
+                   }
+                   break;
+           }
+       break;
+
+      case 80:
+           switch( VentanaActual )
+           {
+            case 1:
+                   OldCurrTrnDir = CurrTrnDir;
+                   CurrTrnDir = AvanzaRetrocede( CurrTrnDir,  1 );
+                   if ( OldCurrTrnDir != CurrTrnDir )
+                   {
+                    CurrRowDir++;
+                    if ( CurrRowDir >= NUM_LINEAS )
+                    {
+                     CurrRowDir = NUM_LINEAS-1;
+                     movetext( 1, 3, 27, 21, 1, 2 );
+                    }
+
+                     CurrTrnArch = Directorios[CurrTrnDir].PosDirectorio + 1;
+                     CurrRowArch = 0;
+                     MuestraArchivos( CurrTrnArch );
+
+                    if ( config.Ruta )
+                    {
+                     ReconstruyeDirectorio( CurrTrnDir );
+                     textcolor( YELLOW );
+                     gotoxy( 2, 23 ); cprintf( "                                                                              " );
+                     gotoxy( 2, 23 ); cprintf( "%s", PathActual );
+                    }
+                   }
+                   break;
+            case 2:
+                   OldCurrTrnDir = CurrTrnArch; OldNivel = MI.nivel;
+
+                   do {
+                    CurrTrnArch++;
+                    fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+                    fread( &MI, sizeof(MI), 1, HFf );
+                   } while ( MI.nivel > OldNivel );
+                   if ( MI.nivel < OldNivel )
+                   {
+                    CurrTrnArch = OldCurrTrnDir;
+                    fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnArch, SEEK_SET );
+                    fread( &MI, sizeof(MI), 1, HFf );
+                   } else {
+                    CurrRowArch++;
+                    if ( CurrRowArch >= (config.Directorios ? 19*2 : 19*4) )
+                    {
+                     CurrRowArch = 0;
+
+                     MuestraArchivos( CurrTrnArch );
+                    }
+                   }
+
+                   break;
+           }
+       break;
+
+     }
+     break;
+
+   }
+   if ( config.Directorios && VentanaActual == 1 )
+      MuestraDirectorio( CurrRowDir, CurrTrnDir, 1 );
+   else
+      MuestraArchivo( CurrRowArch, CurrTrnArch, 1 );
+
+
+  }
+ } while( !ok );
+
+
+  if ( Directorios != NULL ) delete [] Directorios;
+  fclose( HFf );
+ }
+
+ textbackground( BLACK );
+ textcolor( LIGHTGRAY );
+ clrscr();
+}
+
+void ReconstruyeDirectorio( int Nivel )
+{
+  char RutaActual[13];
+  int NivelA;
+
+  // Retrocedemos al nivel anterior
+  NivelA = Directorios[Nivel].Nivel;
+  // Nombre del Nivel 'anterior'
+  fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*Directorios[Nivel].PosDirectorio, SEEK_SET );
+  fread( &MI, sizeof(MI), 1, HFf );
+  strcpy( RutaActual, MI.ff_name );
+
+  if ( NivelA > 0 )
+  {
+   while ( Directorios[Nivel].Nivel != NivelA - 1 ) Nivel--;
+   ReconstruyeDirectorio( Nivel );
+  }
+
+  if ( NivelA == 0 )
+  {
+   fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*Directorios[NivelA].PosDirectorio, SEEK_SET );
+   fread( &MI, sizeof(MI), 1, HFf );
+   sprintf( PathActual, "[%s]\\", MI.ff_name );
+  } else {
+   strcat( PathActual, RutaActual );
+   strcat( PathActual, "\\" );
+  }
+}
+
+
+int AvanzaRetrocede( int PuntoInicio, char RetrocedeAvanza )
+{
+ int oldPI, NivelE;
+
+ oldPI  = PuntoInicio;
+
+ if ( PuntoInicio <= 1 && RetrocedeAvanza == -1 ) return 0;
+
+ do {
+     PuntoInicio+=RetrocedeAvanza;
+ } while ( !Directorios[PuntoInicio].ContraidoExpandido && Directorios[PuntoInicio].Nivel!=0 );
+
+ if ( Directorios[PuntoInicio].Nivel == 0 )
+   return oldPI;
+
+ return PuntoInicio;
+}
+
+void MuestraDirectorio( int Row, int DirMuestra, char como )
+{
+
+ window(2, 2, 27, 23);
+
+ textcolor( LIGHTMAGENTA );
+
+ if ( como )
+ {
+  textbackground( LIGHTMAGENTA );
+  textcolor( BLACK );
+ } else {
+//  textbackground(BLUE);
+  textbackground( BLACK );
+ }
+
+
+ gotoxy( 1, Row+1 );
+ cprintf( "                          " );
+
+ gotoxy( 1+Directorios[DirMuestra].Nivel, Row+1 );
+
+ fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*Directorios[DirMuestra].PosDirectorio, SEEK_SET );
+ fread( &MI, sizeof(MI), 1, HFf );
+ cprintf( "%c%s", Directorios[DirMuestra].Nivel < Directorios[DirMuestra+1].Nivel ? Directorios[DirMuestra+1].ContraidoExpandido ? '-' : '+' : '�', MI.ff_name );
+
+// textbackground(BLUE);
+ textbackground( BLACK );
+
+
+ window(1, 1, 80, 24);
+
+}
+
+
+void LeeDir()
+{
+ long i;
+ int RowFisica;
+
+  rewind( HFf );
+  fread( &CabIM, sizeof(CabIM), 1, HFf );
+
+  if ( Directorios != NULL ) delete [] Directorios;
+  if ( ( Directorios = new MDIREC far [CabIM.NumDirectorios+1] ) != NULL )
+  {
+   fread( Directorios, sizeof(MDIREC), CabIM.NumDirectorios+1, HFf );
+  } else {
+   // No hay memoria suficiente
+   exit(-1);
+  }
+}
+
+void MuestraArchivos( long CurrTrnDir )
+{
+ int CurrNivel, RowFisica;
+ long CurrN;
+
+ fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnDir, SEEK_SET );
+ fread( &MI, sizeof(MI), 1, HFf );
+
+ CurrN     = CurrTrnDir;//Directorios[CurrTrnDir].PosDirectorio + 1;
+
+ CurrNivel = MI.nivel;//Directorios[CurrTrnDir].Nivel + 1;
+
+ for ( RowFisica=3; RowFisica<22; RowFisica++ )
+ {
+  gotoxy( 30, RowFisica );
+  cprintf( "                         �                         " );
+ }
+
+ // Miro si el archivo siguiente a este directorio es de un nivel superior
+ fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrN, SEEK_SET );
+ fread( &MI, sizeof(MI), 1, HFf );
+ if ( MI.nivel != CurrNivel )
+  return;                               // Parece que el directorio estaba vacio
+
+ // Continua solo mientra no estemos en un nivel inferior
+ for ( RowFisica = 0; MI.nivel >= CurrNivel
+                     && RowFisica < (config.Directorios ? 19*2 : 19*4); )
+ {
+   if ( MI.nivel == CurrNivel )
+   {
+    MuestraArchivo( RowFisica, CurrTrnDir, 0 );
+    RowFisica++;
+   }
+   CurrN++;
+//   fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrN, SEEK_SET );
+   fread( &MI, sizeof(MI), 1, HFf );
+ }
+
+  fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*CurrTrnDir, SEEK_SET );
+  fread( &MI, sizeof(MI), 1, HFf );
+
+
+}
+
+void MuestraArchivo( int RowFisica, int PosArch, char como )
+{
+ int s, i;
+
+ if ( como )
+ {
+  textbackground( LIGHTMAGENTA );
+  textcolor( BLACK );
+ } else {
+//  textbackground(BLUE);
+  textbackground( BLACK );
+ }
+
+       // obtenemos la columna: 0 - 1 - 2
+ gotoxy( ( ( RowFisica / 19 ) + ( config.Directorios ? 1 : 0 ) ) * 26 + 5, 3 + RowFisica % 19 );
+
+ if ( MI.ff_name[0] != '.' && strstr( MI.ff_name, "." ) != NULL )
+ {
+  i = 0;
+  while ( MI.ff_name[i] != '.' ) i++;
+  MI.ff_name[i] = '\0';
+  sprintf( Buffer, "%-8s %-3s", MI.ff_name, &MI.ff_name[i+1] );
+  MI.ff_name[i] = '.';
+ } else
+  sprintf( Buffer, "%s", MI.ff_name );
+
+
+
+ Que_Color();                                cprintf("%-12s", Buffer );
+ if( MI.ff_attrib & FA_DIREC )    cprintf("   <dir>");
+ else
+ {
+   textcolor(YELLOW);    formatea_u_long( (unsigned long) MI.ff_fsize, Buffer );
+   			 cprintf(" %11s",  Buffer );
+ }
+}
+
+void Que_Color(void){
+
+ char Extension[4];
+ int i;
+
+/*// Todo lo que este oculto*/
+ if ( MI.ff_attrib & FA_HIDDEN  )                     { textcolor(GREEN); return; }
+/*// Directorios*/
+ if ( MI.ff_attrib & FA_DIREC )                 { textcolor(LIGHTMAGENTA); return; }
+
+ i = 0;
+ while ( MI.ff_name[i] != '.' ) i++;
+ Extension[0] = MI.ff_name[i+1];
+ Extension[1] = MI.ff_name[i+2];
+ Extension[2] = MI.ff_name[i+3];
+ Extension[3] = '\0';
+
+/*// Ejecutaables *.BAT dee proceso por Lotes*/
+ if ( !strcmpi(Extension, "BAT") ) { textcolor(RED); return; }
+/*// Ejecutables *.EXE*/
+ if ( !strcmpi(Extension, "EXE") ) { textcolor(LIGHTCYAN); return; }
+/*// Ejecutables  *.COM*/
+ if ( !strcmpi(Extension, "COM") ) { textcolor(LIGHTGREEN); return; }
+
+/* //Texto*/
+ if ( !strcmpi(Extension, "TXT") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "DOC") ) { textcolor(WHITE); return; }
+/*// Texto con formatos especiales*/
+ if ( !strcmpi(Extension, "WRI") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "WPC") ) { textcolor(WHITE); return; }
+
+/*// M�sica*/
+ if ( !strcmpi(Extension, "MID") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MOD") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "VOC") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "CMF") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "WAV") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "S3M") ) { textcolor(BLUE); return; }
+
+/* // Imagenes y videos*/
+ if ( !strcmpi(Extension, "FLI") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "FLC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MOV") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "AVI") ) { textcolor(MAGENTA); return; }
+
+ if ( !strcmpi(Extension, "CEL") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PNG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PCX") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "GIF") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "JPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "LBM") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TGA") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "DIB") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MAC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "WPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "BMP") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PIC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "RLE") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "CUT") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TIF") ) { textcolor(MAGENTA); return; }
+
+/* // Lenguajes*/
+ if ( !strcmpi(Extension, "C") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "CPP") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "C++") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "PAS") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "ASM") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "VBX") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "LIB") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "BAS") ) { textcolor(BROWN); return; }
+
+/*// Compresores*/
+ if ( !strcmpi(Extension, "ZIP") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARJ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARC") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "AIN") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "LZH") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "TGZ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "RAR") ) { textcolor(LIGHTBLUE); return; }
+
+/*
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+*/
+
+ textcolor(LIGHTGRAY);
+}
+
+
+
+
+void MuestraDirectorios( long DirInicio )
+{
+ int i, RowFisica = 0;
+
+ window(2, 2, 27, 21);
+ clrscr();
+
+ Directorios[0].ContraidoExpandido = 1;
+
+ for ( i=DirInicio; i < CabIM.NumDirectorios &&  RowFisica < NUM_LINEAS; i++ )
+ {
+  if ( Directorios[i].ContraidoExpandido )
+  {
+   gotoxy( 1+Directorios[i].Nivel, RowFisica+1 );
+
+   fseek( HFf, sizeof( CabIM ) + sizeof( MDIREC ) * (CabIM.NumDirectorios+1) + sizeof(MINDEX)*Directorios[i].PosDirectorio, SEEK_SET );
+   fread( &MI, sizeof(MI), 1, HFf );
+   cprintf( "%c%s", Directorios[i].Nivel < Directorios[i+1].Nivel ? Directorios[i+1].ContraidoExpandido ? '-' : '+' : '�', MI.ff_name );
+   RowFisica++;
+  }
+ }
+
+
+ window(1, 1, 80, 24);
+
+}
+
+ /**************************************************************************\
+|*                                                                          *|
+|*  ContraeExpandeRama                                                      *|
+|*                                                                          *|
+|*  Descripci�n:                                                            *|
+|*              Contrae o expande la rama seg�n el par�metro y apartir del  *|
+|*              punto indicado...                                           *|
+|*                                                                          *|
+|*  Entradas: Puntero al inicio de la expanci�n / contraccion               *|
+|*            Accion a ejecutar: CONTRAE / EXPANDE                          *|
+|*                                                                          *|
+|*  Salidas:  (ninguna)                                                     *|
+|*                                                                          *|
+ \**************************************************************************/
+void ContraeExpandeRama( MDIREC far *DesdeAqui, char ContraeExpande )
+{
+ int NivelE;
+
+ NivelE = DesdeAqui -> Nivel;
+
+ DesdeAqui++;
+  while( DesdeAqui -> Nivel > NivelE  )
+  {
+   if ( ContraeExpande )
+   {
+    if ( DesdeAqui -> Nivel == NivelE + 1 )
+     DesdeAqui -> ContraidoExpandido = ContraeExpande;
+   } else
+     DesdeAqui -> ContraidoExpandido = ContraeExpande;
+   DesdeAqui++;
+  }
+
+}
+
+
+/*
+//
+// ���� ���� ���  �   �  ��  ��� ���  ��           �    ���� �   � �����
+// �    �  � �  � ����� �  �  �  �   �  �          �    �  � ��  � �
+// ���  �  � ���  �   � ����  �  ��  ����   � �    �    �  � � � � � ���
+// �    �  � � �  �   � �  �  �  �   �  �   � � �� �    �  � �  �� �   �
+// �    ���� �  � �   � �  �  �  ��� �  �   ���    ���� ���� �   � �����
+*/
+void formatea_u_long( unsigned long Numero, char *Inter_Chg) {
+
+	char Buffer1[80];
+	char Buffer2[80];
+	int c;
+
+		sprintf(Buffer1, "%lu", Numero);
+			strcpy(Buffer2, "\0");
+			strrev(Buffer1);
+			c = strlen( Buffer1 );
+		      while( c >= 3 ){
+			c -= 3;
+			strncat( Buffer2, Buffer1, 3);
+			strrev(Buffer1);
+			Buffer1[c] = '\0';
+			strrev(Buffer1);
+			if(strlen(Buffer1)!=0)
+				strcat( Buffer2, "." );
+		      }
+			strcat( Buffer2, Buffer1);
+strrev(Buffer2);
+strcpy(Inter_Chg, Buffer2);
+
+/*// return Buffer2;*/
+}
diff --git a/INDEXM.EXE b/INDEXM.EXE
new file mode 100644
index 0000000..234b875
Binary files /dev/null and b/INDEXM.EXE differ
diff --git a/LEEIDX.CPP b/LEEIDX.CPP
new file mode 100644
index 0000000..d6de511
--- /dev/null
+++ b/LEEIDX.CPP
@@ -0,0 +1,89 @@
+#include <conio.h>
+
+typedef struct
+{
+ char FA[1024];
+} CABECERA_IM;
+
+typedef struct
+{
+ unsigned char Nivel;           // Nivel actual en el que me encuentro
+ char ff_attrib;       /* attribute found */
+ int  ff_ftime;        /* file time */
+ int  ff_fdate;        /* file date */
+ long ff_fsize;        /* file size */
+ char ff_name[13];     /* found file name */
+} MINDEX;
+
+
+void DibujaPantalla(void)
+{
+         //123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789-
+ clrscr();
+ textbackground(BLUE);
+ textcolor(LIGHTCYAN);
+ cprintf( "-x������������������������Ŀ  Nombre           Tama�o � Nombre           Tama�o " );
+ cprintf( "                           � ���������������������������������������������������" );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "                           �                          �                         " );
+ cprintf( "�x����������������������������������������������������������������������������Ŀ" );
+ cprintf( "�                                                                              �" );
+ cprintf( "��������������������������������������������������������������������������������" );
+
+ textcolor( YELLOW );
+ gotoxy( 31 , 1 ); cprintf( "Nombre           Tama�o" );
+ gotoxy( 57,  1 ); cprintf( "Nombre           Tama�o" );
+
+ textbackground( RED );
+ gotoxy(  2 , 1 ); cprintf( "x" );
+ gotoxy(  2, 22 ); cprintf( "x" );
+
+};
+
+typedef struct
+{
+ char Directorios;
+ char Ruta;
+
+} CONFIG;
+
+CONFIG config;
+
+void MuestraDirectorios( int DirInicio );
+void LeeConstruyeDir(char *NArchivo);
+
+void main(void)
+{
+ int ok;
+ DibujaPantalla();
+
+ char CurrRowDir;
+ int  CurrTrnDir;
+
+ ConstruyeDir("i1.idm");
+
+ CurrRowDir = 0;
+ CurrTrnDir = 0;
+ if ( config.Directorios )
+  MuestraDirectorios( CurrRowDir + CurrTrnDir );
+
+}
+
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ae9f90a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+#INDEXM 
+ 
+ 
+*20/09/1997* 
+ 
+ToDo: wwtcf? 
+ 
+ 
+![screenshot](/INDEXM.png "Screenshot")