00001 /* floppy.h */ 00002 00003 #ifndef __SYSTEM 00004 #include "routix/system.h" 00005 #endif 00006 00007 #ifndef __FAT12 00008 #define __FAT12 00009 00010 //Macros para simplificar el uso de la funcion leer_escribir 00011 #define leer_sector(sec,buf) leer_escribir(READ_SECTOR,sec,buf) 00012 #define escribir_sector(sec,buf) leer_escribir(WRITE_SECTOR,sec,buf) 00013 00014 #define BOOTSECTOR 0 00015 00016 // Estructura utilizada para caracterizar una particion FAT 00017 typedef struct dev_fat_t 00018 { 00019 word fat_size; //Cantidad de sectores que ocupa cada FAT 00020 word fat_start; //Sector de comienzo de la FAT 00021 byte cantidad_de_fats; //Cantidad de FATs por disco (geenralmente 2) 00022 word root_dir_start; //Sector de comienzo del Directorio raiz 00023 word root_dir_size; //Cantidad de sectores asignados al root 00024 dword sectores_ocultos; 00025 word sectores_totales; //cantidad total de sectores del disco 00026 byte sectores_por_cluster; 00027 word sector_size; 00028 byte fat_levantada; 00029 byte boot_leido; //Indica si el BPB ha sido leido y los parametros han sido cargados en las variables 00030 }dev_fat_t; 00031 00032 00033 // Estructura que contiene los campos principales de un BootSector tanto en FAT12 como FAT16 (son los primeros 62 bytes) 00034 typedef struct boot_sector_t 00035 { 00036 unsigned BS_jmpBott: 24; 00037 qword BS_OEMName; 00038 unsigned BPB_BytsPerSec: 16; 00039 unsigned BPB_SecPerClus: 8; 00040 unsigned BPB_RsvdSecCnt: 16; 00041 unsigned BPB_NumFATs: 8; 00042 unsigned BPB_RootEntCnt: 16; 00043 unsigned BPB_TotSec16: 16; 00044 unsigned BPB_Media: 8; 00045 unsigned BPB_FATSz16: 16; 00046 unsigned BPB_SecPerTrk: 16; 00047 unsigned BPB_NumHeads: 16; 00048 unsigned BPB_HiddSec: 32; 00049 unsigned BPB_TotSec32: 32; 00050 unsigned BS_DrvNum: 8; 00051 unsigned BS_Reserved1: 8; 00052 unsigned BS_BootSig: 8; 00053 unsigned BS_VolID: 32; 00054 char BS_VolLab[11]; 00055 char BS_FilSysType[8]; 00056 }boot_sector_t; 00057 00058 00059 //Estos son los datos que identifican a cada archivo dentro de un directorio 00060 typedef struct fat12_entry_t 00061 { 00062 byte nombre[8]; 00063 byte extension[3]; 00064 byte atributo; 00065 byte reservado[10]; 00066 word hora; 00067 word fecha; 00068 word sector; //Cluster de comienzo del archivo (relativo al final del ultimo sector de ROOT 00069 dword size; //Tamaņo en bytes 00070 }fat12_entry_t; 00071 00072 //Esta estructura es reciente. La idea es que con *fat12_data recoja la info del directorio, y que mediante la funcion 00073 //fat_adapta_name la escriba en formato string dentro de nombre. 00074 #define MAX_PATH_LEN 29 00075 00076 typedef struct fat12_entry_ext_t 00077 { 00078 fat12_entry_t fat12_data; 00079 char nombre[MAX_PATH_LEN]; 00080 }fat12_entry_ext_t; 00081 00082 struct floppy_cache 00083 { 00084 dword sector; 00085 byte bloque[512]; 00086 struct floppy_cache *next; 00087 00088 }; 00089 00090 //Valores que puede tomar el 1er byte del campo nombre ( estructura dir_entry_t) 00091 //Cualquier otro valor, significa el valor del primer caracter del nombre de archivo 00092 #define FAT_EMPTY 0 // Campo aun no usado (luego del formateo) 00093 #define FAT_SUBDIR 0x2E // El archivo es un directorio 00094 #define FAT_DELETED 0xE5 // El archivo fue borrado 00095 00096 #define SECTOR_SIZE 512 00097 00098 00099 // structura utlizada para generar una lista enlazada que apunta a bloques en memoria que contienen la FAT 00100 // del floppy que se encuentra en la diskettera. 00101 typedef struct fat_t 00102 { 00103 byte *bloque; 00104 struct fat_t *next; 00105 }fat_t; 00106 00107 00108 //Tipo usado para mantener una lista enlazada con los sectores de un archivo contenidos en memoria 00109 /* 00110 typedef struct file_loaded_t 00111 { 00112 byte *bloque; //Apunta a un sector 00113 struct file_loaded_t *next; 00114 00115 } file_loaded_t; 00116 */ 00117 00118 int init_floppy_fs(void); 00119 00120 // Adapta un nombre de la forma fat (KERNEL BIN) a formato string: KERNEL.BIN\0 00121 // asi es mas facil su comparacion, impresion y usos varios 00122 void fat_adapta_name (byte *nombre_fat, byte *adaptado); 00123 00124 // Recibe un nombre de archivo, y lo busca en el disco. En caso negativo retorna NULL 00125 fat12_entry_t *fat_file_find (char *nombre, fat12_entry_t *datos_archivo); 00126 00127 // Esta funcion recibe como parametro un numero de sector y mediante la FAT obtiene cual es el siguiente 00128 int fat_next_sector ( dword sector_inicial ); 00129 00130 void *floppy_cache (dword sector); 00131 00132 // Abrir un archivo desde un dispositivo con formato FAT12 00133 int open_FAT12 (char *nombre, int fd); 00134 00135 00136 #define DIR_FAT_VIRTUAL 0xF8000000 00137 00138 00139 #endif 00140