#ifndef __SFFISICO_H
#define __SFFISICO_H

/*								*/
/*	SFFISICO.H						*/
/*	==========						*/
/*								*/
/*	Interfaz con el Sistema de Ficheros Físico		*/
/*								*/


/* Tipos básicos de estas prácticas */
#include "tipos.h"


/* Estructura del superbloque */

struct Superbloque
{                               /* DESPL.       Descripción     */
  char  magico[8];              /*  0 - Cadena de caracteres para verificar el formato */
  WORD  tam_bloque_fisico;      /*  8 - tamaño en bytes de un bloque físico */
  DWORD num_bloques_fisicos;    /* 10 - cantidad total de bloques físicos */
};

#define MAGICO "SOPA123"        /* Cadena identificadora de un disco */



/************************/
/* Límites y constantes */
/************************/

#define TAM_SUPERBLOQUE sizeof(struct Superbloque)

#define MIN_TAMBLOQUE	96		/* para que quepa el superbloque */

/* Estas dos constantes pueden alterarse */

#define MAX_TAMBLOQUE	8192
#define MAX_TAMDISCO	(1L<<24)		/* 16 megabytes */

#define MAX_BLOQUES_FISICOS	(MAX_TAMDISCO/MIN_TAMBLOQUE)



/****************************/
/* Servicios de este módulo */
/****************************/


/* Instalación y montaje del disco */

int FabricaDisco ( const char* nombre_fichero,
		   WORD tam_bloque, DWORD num_bloques );
int MontaDisco ( const char* nombre_fichero, int nbloques_cache );
int DesmontaDisco (void);

int LeeDatosDisco ( WORD* tam_bloque, DWORD* num_bloques );


/* Lectura y escritura de bloques físicos */

int LeeBloqueFisico ( DWORD nbloque, void* bufer );
int EscribeBloqueFisico ( DWORD nbloque, const void* bufer );

enum ModoAccesoFisico { ACCESO_FISICO_LECTURA=0, ACCESO_FISICO_ESCRITURA=1 };
int AccedeBloqueFisico ( DWORD nbloque, void* bufer, enum ModoAccesoFisico );