2.2.1. Formato: Detalles de los sectores
Los sectores de un cilindro están separados entre ellos por unos delimitadores.
A su vez, están internamente divididos en partes y entre cada parte existe otro delimitador. Las dos partes pricipales son ID y DATOS.
Las estructuras usadas por cada sector en los discos de IBM PC son:
Discos FM (genérico, antiguos, en PC sólo algunos 5,25" y mas grandes):
INICIO PISTA:
Delimitador A --- 40 bytes 0xFF
SYNC --- 6 bytes 0x00
IAM - Índice --- 1 byte 0xFC
Delimitador B --- 26 bytes 0xFF
SECTORES (repetido tantas veces como sectores):
SYNC --- 6 bytes 0x00
IDAM --- 1 byte 0xFE (ID Address Mark)
Cylinder --- 1 byte con el número de cilindro actual
Head --- 1 byte con el número de cara actual (0x00 o 0x01)
Sector --- 1 byte con el número de sector actual
Sector Size --- 1 byte con el tamaño de sector. En PCs correientes es siempre fijo. Ver tabla inferior.
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador C --- 11 bytes 0xFF
SYNC --- 6 bytes 0x00
Data AM --- 1 byte 0xFB o 0xF8
DATOS --- bytes del usuario - El tamaño depende del disco
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador IS --- ??? -- No existe en el último sector
FIN PISTA:
Delimitador FIN --- ??? -- Solo existe en el último sector
Discos MFM: 3,5" y 5,25" IBM PC (DOS)
INICIO PISTA:
Delimitador A --- 80 bytes 0x4E
SYNC --- 12 bytes 0x00
IAM - Índice --- 3 bytes 0xC2 + 1 byte 0xFC
Delimitador B --- 50 bytes 0x4E
SECTORES (repetido tantas veces como sectores -8 o 9 veces-):
SYNC --- 12 bytes 0x00
IDAM --- 3 bytes 0xA1 + 1 byte 0xFE (ID Address Mark)
Cylinder --- 1 byte con el número de cilindro actual
Head --- 1 byte con el número de cara actual (0x00 o 0x01)
Sector --- 1 byte con el número de sector actual
Sector Size --- 1 byte con el tamaño de sector. En PCs correientes es siempre fijo. Ver tabla inferior.
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador C --- 22 bytes 0x4E
SYNC --- 12 bytes 0x00
Data AM --- 4 bytes 0xA1 + 1 byte 0xFB o 0xF8
DATOS --- 512 bytes del usuario
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador IS --- 54 bytes 0x4E -- No existe en el último sector
FIN PISTA:
Delimitador FIN --- 652 bytes 0x4E -- Solo existe en el último sector
Discos MFM HP: algunos 3,5" y algunos 5,25":
INICIO PISTA:
Delimitador A --- 32 bytes 0x4E
SECTORES (repetido tantas veces como sectores -16 veces-):
SYNC --- 12 bytes 0x00
IAM - Índice --- 3 bytes 0xA1 + 1 byte 0xFE
Delimitador B --- 26 bytes 0xFF
SYNC --- 6 bytes 0xFF
IDAM --- 1 byte 0xFE (ID Address Mark)
Cylinder --- 1 byte con el número de cilindro actual
Head --- 1 byte con el número de cara actual (0x00 o 0x01)
Sector --- 1 byte con el número de sector actual
Sector Size --- 1 byte con el tamaño de sector. En PCs correientes es siempre fijo. Ver tabla inferior.
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador C --- 22 bytes 0x4E
SYNC --- 12 bytes 0x00
Data AM --- 4 bytes 0xA1 + 1 byte 0xFB
DATOS --- 256 bytes del usuario
CRC --- 2 bytes de CRC (usualmente CCITT)
Delimitador IS --- 46 bytes 0x4E -- No existe en el último sector
FIN PISTA:
Delimitador FIN --- 204 bytes 0x4E -- Solo existe en el último sector
Tabla de valores para el campo Tamaño de sector de la cabecera IDAM
Nota: En un PC DOS/Windows el valor Sector Size será de 512by, por lo tanto 0x02
Cálculo del CRC CCITT
El cálculo del CRC se hace mediante la función CCITT CRC16: G(x)=x^16 + x^12 + x^5 + 1.
Un ejemplo de implementación en C es (uint16_t es unsigned int de 16 bits):
Código: Seleccionar todo
#define POLY 0x8408
uint16_t crc16(char *data_p, uint16_t length) {
unsigned char i;
uint16_t data;
uint16_t crc;
crc = 0xffff;
if (length == 0) {
return (~crc);
}
do {
for (i = 0, data = (uint16_t) 0xff & *data_p++; i < 8; i++, data >>= 1) {
if ((crc & 0x0001) ^ (data & 0x0001)) {
crc = (crc >> 1) ^ POLY;
} else {
crc >>= 1;
}
}
} while (--length);
crc = ~crc;
data = crc;
crc = (crc << 8) | (data >> 8 & 0xFF);
return (crc);
}
Además, he creado dos librerías para hacer este cálculo en el IDE Arduino: