4 #include "routix/system.h"
10 //Macros para simplificar el uso de la funcion leer_escribir
11 #define leer_sector(sec,buf) leer_escribir(READ_SECTOR,sec,buf)
12 #define escribir_sector(sec,buf) leer_escribir(WRITE_SECTOR,sec,buf)
16 // Estructura utilizada para caracterizar una particion FAT
17 typedef struct dev_fat_t
19 word fat_size
; //Cantidad de sectores que ocupa cada FAT
20 word fat_start
; //Sector de comienzo de la FAT
21 byte cantidad_de_fats
; //Cantidad de FATs por disco (geenralmente 2)
22 word root_dir_start
; //Sector de comienzo del Directorio raiz
23 word root_dir_size
; //Cantidad de sectores asignados al root
24 dword sectores_ocultos
;
25 word sectores_totales
; //cantidad total de sectores del disco
26 byte sectores_por_cluster
;
29 byte boot_leido
; //Indica si el BPB ha sido leido y los parametros han sido cargados en las variables
33 // Estructura que contiene los campos principales de un BootSector tanto en FAT12 como FAT16 (son los primeros 62 bytes)
34 typedef struct boot_sector_t
36 unsigned BS_jmpBott
: 24;
38 unsigned BPB_BytsPerSec
: 16;
39 unsigned BPB_SecPerClus
: 8;
40 unsigned BPB_RsvdSecCnt
: 16;
41 unsigned BPB_NumFATs
: 8;
42 unsigned BPB_RootEntCnt
: 16;
43 unsigned BPB_TotSec16
: 16;
44 unsigned BPB_Media
: 8;
45 unsigned BPB_FATSz16
: 16;
46 unsigned BPB_SecPerTrk
: 16;
47 unsigned BPB_NumHeads
: 16;
48 unsigned BPB_HiddSec
: 32;
49 unsigned BPB_TotSec32
: 32;
50 unsigned BS_DrvNum
: 8;
51 unsigned BS_Reserved1
: 8;
52 unsigned BS_BootSig
: 8;
53 unsigned BS_VolID
: 32;
55 char BS_FilSysType
[8];
59 //Estos son los datos que identifican a cada archivo dentro de un directorio
60 typedef struct fat12_entry_t
68 word sector
; //Cluster de comienzo del archivo (relativo al final del ultimo sector de ROOT
69 dword size
; //TamaƱo en bytes
72 //Esta estructura es reciente. La idea es que con *fat12_data recoja la info del directorio, y que mediante la funcion
73 //fat_adapta_name la escriba en formato string dentro de nombre.
74 #define MAX_PATH_LEN 29
76 typedef struct fat12_entry_ext_t
78 fat12_entry_t fat12_data
;
79 char nombre
[MAX_PATH_LEN
];
86 struct floppy_cache
*next
;
90 //Valores que puede tomar el 1er byte del campo nombre ( estructura dir_entry_t)
91 //Cualquier otro valor, significa el valor del primer caracter del nombre de archivo
92 #define FAT_EMPTY 0 // Campo aun no usado (luego del formateo)
93 #define FAT_SUBDIR 0x2E // El archivo es un directorio
94 #define FAT_DELETED 0xE5 // El archivo fue borrado
96 #define SECTOR_SIZE 512
99 // structura utlizada para generar una lista enlazada que apunta a bloques en memoria que contienen la FAT
100 // del floppy que se encuentra en la diskettera.
108 //Tipo usado para mantener una lista enlazada con los sectores de un archivo contenidos en memoria
110 typedef struct file_loaded_t
112 byte *bloque; //Apunta a un sector
113 struct file_loaded_t *next;
118 int init_floppy_fs(void);
120 // Adapta un nombre de la forma fat (KERNEL BIN) a formato string: KERNEL.BIN\0
121 // asi es mas facil su comparacion, impresion y usos varios
122 void fat_adapta_name (byte
*nombre_fat
, byte
*adaptado
);
124 // Recibe un nombre de archivo, y lo busca en el disco. En caso negativo retorna NULL
125 fat12_entry_t
*fat_file_find (char *nombre
, fat12_entry_t
*datos_archivo
);
127 // Esta funcion recibe como parametro un numero de sector y mediante la FAT obtiene cual es el siguiente
128 int fat_next_sector ( dword sector_inicial
);
130 void *floppy_cache (dword sector
);
132 // Abrir un archivo desde un dispositivo con formato FAT12
133 int open_FAT12 (char *nombre
, int fd
);
136 #define DIR_FAT_VIRTUAL 0xF8000000