Ejemplo n.º 1
0
/**
 * cargar_fat: Carga la tabla FAT en memoria (en una variable global)
 *
 * @return el estado de la operacion
 */
int cargar_fat() {
   int indice;
   int tamanio_fat;
   dword sector_fat;

   if ( sector_booteo == NULL ) {
      if ( cargar_BPB (sector_booteo) == ERROR ) {
         imprimir ("Error cargando el sector de booteo\n");
         return ERROR;
      }
   }

   // obtengo el tamanio de la fat en bytes
   tamanio_fat = sector_booteo->BPB_tamanio_FAT * 512; 

   // le aloco memoria
   fat = (byte*) sys_alocar ( tamanio_fat );

   // inicializo la FAT con ceros
   setear_memoria ( fat, 0, tamanio_fat );

   // obtengo el primer sector (LOGICO) donde comienza la tabla FAT
   // (el primer sector es el del BPB, luego del cual vienen los sectores
   // reservados, y a continuacion la tabla FAT).
   sector_fat = sector_booteo->BPB_cant_sectores_reservados + 1;

   // leo los N sectores que conforman la tabla FAT
   imprimir ( "Cargando FAT" );
   for ( indice = 0; indice < sector_booteo->BPB_tamanio_FAT; indice++ ) {
      imprimir ( "." );
      /*
       * sector_fat es un sector logico, el cual antes de leerlo hay que
       * trasnformarlo a CHS.
       * fat es el buffer donde leemos, pero hay que ir incrementandolo por
       * cada lectura(la primera vez (fat), la segunda (fat+512), y asi...
       */
      if ( leer_sector_logico (sector_fat, fat + indice * 512) == 
                                                        LECTURA_ERRONEA ) {
         imprimir ( "Error al leer la tabla fat!\n" );
         return ERROR;
      }
      // leo el siguiente sector logico
      sector_fat++;
   }
   imprimir ( "\n" );
   #ifdef DEBUG
   // el MediaID es 0xF0 para disquettes!
   imprimir ( "FAT Cargada, MediaID: 0x%xb\n", *fat );
   #endif

   return OK;
}
Ejemplo n.º 2
0
   /**
    * inicializa_teclado: Funcion utilizada para inicializar el teclado.
    * Se encarga de alocar el buffer_teclado, inicializar los indices del 
    * buffer a 0. Deja habilitadas las teclas y los leds.
    * Tambien , el comando 0xF3 al port 0x60 setea la velocidad de retardo,
    * a continuacion se escribe al port 0x63 un byte con los valores:
    *
    * <PRE>
    *
    *   +---+---+---+---+---+---+---+---+
    *   | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    *   +---+---+---+---+---+---+---+---+
    *     |   |   |   |   |   |   |   |
    *     |   |   |   |   |   +---+---+--> Numero A
    *     |   |   |   |   |
    *     |   |   |   +---+--> Numero B
    *     |   |   |
    *     |   +---+--> Tiempo que transcurre desde que se presiona una tecla
    *     |            hasta que empieza a repetirse (en intervalos de 0.25seg).
    *     |   
    *     +--> Siempre va seteado a cero   
    *                                                    1
    *  Tasa de Autorepeticion (Teclas/sec): --------------------------- 
    *                                        ( 8 + A ) * 2^B * 0.00417
    *
    *  Si seteamos al teclado para que espere 0.25 segundos y acepte 10
    *  caracteres por segundo, este byte deberia valer:
    *  0x2C = 0 01 01 100 -> A:4 B:1 
    *  0x40 = 0 10 00 000
    *
    * </PRE>
    */
void inicializa_teclado() {

   //outb ( 0xFF, 0x60 ); // escribo el comando 0xFF RESET(incluye BAT)
   //while ( inb (0x60) != 0xAA ); // espero final OK del BAT. 
   //while ( inb (0x60) != 0xFA ); // espero la senial de reconocimiento

   outb ( 0xF3, 0x60 ); // escribo el comando 0xF3
   while ( inb (0x60) != 0xFA ); // espero la senial de reconocimiento
   outb ( 0x20, 0x60 ); // escribo los parametros del comando 0xF3
   while ( inb (0x60) != 0xFA ); // vuelvo a esperar reconocimiento

   //Se inicializan los leds. Todos Apagados.
   setear_leds ( (byte)0, (byte)0, (byte)0 );
   
   buffer_teclado = (char*) sys_alocar (LIMITE);
   buffer_teclado = setear_memoria (buffer_teclado, ASCII_FIN_LINEA, LIMITE);

   indice_lectura = 0;
   indice_escritura = 0;
   caracteres_leidos = 0;
}