QL Programación Avanzada
Anterior Siguiente

Apéndice D - Formato de los Microdrives

Este apéndice es una colección de datos sobre los microdrives del QL. Nos da detalles sobre la forma en que se disponen los ficheros sobre el bucle continuo de cinta y por qué. La lectura de este apéndice le dará unos conocimientos más profundos sobre la operación de los microdrives según los ve la máquina.

D.1 Formato de los microdrives

Los microdrives están formados por un largo bucle de cinta magnética de alta calidad. Cuando está funcionando el motor, cualquier punto concreto de la cinta pasará sobre la cabeza de lectura/escritura una vez cada 7 segundos. Se requiere un sistema de encontrar el sitio de la cinta donde están situados unos datos concretos. Idealmente, los datos se escriben sobre toda la longitud de la cinta. En la práctica, esto no se hace por varias razones. Primera de todas, un sistema no es eficiente cuando no es posible localizar fácilmente el dato que estamos buscando. Segundo, si alguien quiere modificar un octeto, la cabeza de borrado se debe activar instantáneamente antes de que haya pasado el octeto, vuelta a desactivar al final del mismo y asegurarse de que no se han borrado otros octetos.

Para producir un sistema práctico y eficiente, el bucle se ha dividido en sectores. Cada uno de estos sectores tiene 512 octetos de datos. Cuando se formatea por primera vez un cartucho de microdrive, se graban pequeñas marcas de sector (cabeceras de sector) a lo largo de toda la cinta. El espacio entre las cabeceras de sector se rellena con datos inservibles, para comprobar que se pueden grabar datos correctamente en esa parte del bucle. Al principio y al final de cada sector hay un espacio libre para asegurarse de que el sector, se puede modificar sin afectar a los sectores adyacentes, aunque se use en otra unidad donde la velocidad del motor puede variar ligeramente. Para leer o modificar un solo octeto, se debe leer el sector completo. Una vez que se ha procesado el octeto apropiado, y por supuesto modificado, es necesario escribir de nuevo al microdrive los 512 octetos del sector.


Figura D.1 - Formato de los sectores de microdrive

Hay cuatro elementos reconocibles grabados en un microdrive:

1. Preámbulo/Sinc

El 'preámbulo/sinc' consiste en un mínimo de 5 octetos a ceros. Los dos primeros permiten reconocer el preámbulo. Una vez reconocido, se usan los siguientes tres octetos para enganchar el PLL ('phase locked loop'). El preámbulo va seguido por un octeto a unos ($FF) en cada pista (hay dos pistas) para sincronizar los registros de lectura en frontera de octeto.

El preámbulo estándar al principio de un sector tiene 10+2 octetos de longitud. Dentro del bloque se usa un preámbulo especial de 6+2 octetos. Esto anula el PLL de forma que se pueda leer la cabecera del bloque separadamente de la parte principal del mismo.

2. Datos

El propósito final del microdrive es almacenar datos útiles, de modo que este es el más importante de todos los elementos (pero que no puede existir por sí solo). Los datos se graban en múltiplos de 2 octetos. Hay tres tipos de datos en un sector de formato estándar. Son, la cabecera del sector ($FF, número de sector y 10 octetos del nombre), la cabecera de bloque (número del fichero y número del bloque), y el bloque en sí (512 octetos).

3. Checksum

Cada bloque de datos tiene una palabra especial detrás. Esta palabra es el 'checksum', que permite la verificación de los datos. Si el 'checksum' que se genera al leer los datos no coincide con el que hay grabado al final, normalmente significa que ha habido un error de lectura. El 'checksum' es rápido de calcular, es transparente a la pérdida de bits (rotación de octetos aparentes de datos) y es efectivo ante los grupos de bits a ceros o a unos. El 'checksum' se calcula de la siguiente forma:

  1. se pone al principio a $0F0F
  2. por cada octeto, se añade éste al 'checksum'
  3. grabar o comprobar el 'checksum', primero el octeto inferior y después el superior.

4. Hueco

Los huecos se usan para evitar que se escriban, inadvertidamente, unos datos encima de otros. Hay un hueco para separar la cabecera de sector (que sólo se escribe cuando se formatea la cinta) de los datos que contiene (que es reescrito cada vez que se necesita). Hay otro hueco entre el final de un sector y el principio del siguiente.

La longitud mínima requerida para el hueco, se calcula de la siguiente forma. El peor caso de tiempo de borrado (200us) más el tiempo requerido para eliminar el borrado (20us), más un tiempo incierto de los procedimientos de escritura y formateo (siempre menor de 160us), más (sólo para los huecos entre sectores - la cabecera del sector no se reescribe nunca) la máxima variación del bloque escrito, incluido el hueco anterior al bloque (10% de la longitud total).

Con esta longitud de hueco, es posible que permanezcan partes del formato del bloque, después que se ha reescrito un sector. Este problema se combate controlando cuidadosamente el contenido del bloque de formato, que nos asegura que no se va a tomar parte del final del bloque de formato, como si fuera una cabecera de sector.

La cabecera del sector

La cabecera de sector tiene 14 octetos de longitud. El primer octeto es el indicador de cabecera de sector, y está puesto a $FF. El segundo octeto contiene el número del sector. Los sectores están numerados por orden descendente desde 255 (esto depende de la longitud real de la cinta en el cartucho) a 0.

Los 10 octetos siguientes contienen el nombre del medio, que puede tener hasta 10 caracteres de longitud. Si el nombre es menor, los restantes octetos se rellenan con espacios. Los octetos 13 y 14 contienen un número aleatorio de 16 bits.

La cabecera del bloque

La cabecera de bloque tiene dos octetos. El primero es el número del fichero o un indicador. El número del fichero está en el rango de $00 a $F0 para los ficheros comunes. Hay dos números de fichero especiales, $F8 está reservado para el mapa del microdrive y el valor de indicador $FD que marca el bloque como vacante o malo. El segundo octeto contiene el número de bloque ($00 a $FE). Los números de bloque empiezan por el cero, por lo que los octetos 0 a 511 del fichero están en el bloque 0, los octetos 512 a 1023 en el bloque 1, y así sucesivamente.

El bloque

Los bloques tienen 512 octetos de longitud y contienen los datos del fichero. Los datos no comienzan inmediatamente después del final de la cabecera de bloque, sino que tienen un pequeño preámbulo que permite a los programas de alto nivel hacer algún pequeño proceso antes de leer el bloque.

Bloques especiales

El sector 0 contiene el único bloque especial del medio. Este bloque contiene el mapa de sectores, y se le ha designado como fichero número $F8, bloque 0.

El bloque contiene 255 pares de octetos. Cada par contiene el número del fichero que ocupa ese sector más el número del bloque dentro del fichero. Un número de fichero de $FD indica que el sector está vacante, mientras que un número de fichero de $FF, indica que el sector está dañado y no debe ser usado. El último octeto del bloque del mapa del sector, contiene el número del sector más recientemente asignado en el medio.

Estructura de ficheros

Hay una cabecera de 64 octetos al principio de cada fichero. Normalmente no concierne al usuario, ya que los programas de alto nivel lo esconden a las aplicaciones ordinarias. El formato es:

$00longitud del fichero
$04clave de acceso del fichero
$05tipo de fichero
$068 octetos de información dependiente del tipo
$0Enombre del fichero (2 octetos de contador + caracteres ASCII)
$34fecha actualizada (no implementada en QDOS V1.03)
$38fecha de referencia (no implementada en QDOS V1.03)
$3Cfecha copia (no implementado en QDOS V1.03)

El directorio

El directorio es el fichero 0, y es un fichero muy especial ya que mantiene copias de las cabeceras de todos los ficheros del medio. La cabecera del fichero 0 (él mismo) empieza en el octeto 0 del fichero, la copia de la cabecera del fichero l, empieza en el octeto 64 y así sucesivamente. Para borrar un fichero, se borran de la copia en el directorio su longitud y la de su nombre. Esto significa que el fichero puede ser recuperado con un programa de utilidad que reemplace estas dos piezas de información.

Asignación de sectores

Los microdrives tiene un tiempo de comienzo y de fin, finito. Por lo tanto, es necesario que el motor consiga la velocidad adecuada, antes de que pueda leer o escribir. Hay dos factores que se deben acomodar lo mejor posible (esto depende de lo lleno que esté el microdrive). Antes de nada, el primer bloque del fichero se debe posicionar, por lo que hay 20 sectores entre el sector asignado más recientemente y él mismo (esto se hace para permitir las operaciones que comprueban que el medio no se ha alterado). El segundo factor es para un fichero que tenga más de un bloque de longitud. Se saltan doce sectores entre bloques sucesivos de un fichero. Esto permite al motor pararse y rearrancar entre los bloques.

Estructura de un sector en un microdrive

Descripción# de octetostiempotiempo total
Preámbulo12 octetos480 µs
Cabecera sector14 octetos560 µs1040 µs
Checksum2 octetos80 µs1120 µs
Hueco 13600 µs4720 µs
Preámbulo12 octetos480 µs
Cabecera bloque2 octetos80 µs560 µs
Checksum2 octetos80 µs640 µs
Preámbulo8 octetos320 µs960 µs
Registro512 octetos20480 µs21440 µs
Checksum2 octetos80 µs21520 µs
Hueco 25520 µs27040 µs
Total31760 µs

Estos tiempos dan 225 + 5% sectores por medio.

Estructura de sectores especiales

La utilidad de formateo usa una estructura especial para asegurarse de que la región entera puede escribirse. Esta estructura especial requiere que la región de la cinta verificada solape todas las regiones que puedan ser usadas para escribir datos.

La cabecera de sector se deja en su formato estándar ya que no se reescribe. Sin embargo, el Hueco 1 es acortado de forma que el bloque que se escribe solapa la región que ocupa normalmente el preámbulo. El siguiente bloque se extiende añadiendo 86 octetos al final. El bloque se rellena con $AA55 (binario 1010 1010 0101 0101) excepto la palabra que está a 512 octetos del principio, ej. el 'checksum' estándar. La estructura es:

Descripción# de octetostiempotiempo total
Preámbulo12 octetos480 µs 
Cabecera sector14 octetos560 µs1040 µs
Checksum2 octetos80 µs1120 µs
Hueco 1>2840 µs
(3600-10%-400 (longitud preámbulo))
2840 µs3960 µs
Preámbulo12 octetos480 µs 
Oct. form. (EE)610 octetos24400 µs24880 µs
Checksum2 octetos80 µs24960 µs
Hueco 2>2840 µs2840 µs27800 µs
 Total31760 µs 

La extensión está diseñada para cubrir un 10% más del tiempo nominal desde el principio del hueco 1 al final del sector estándar (2620 µs).

A esto se le debe añadir el tiempo que se le ha acortado al Hueco 1 (760 µs) más el tiempo incierto (160 µs) que totaliza 3440 µs, el equivalente a 86 octetos.

Tipos de error

Estos son los errores más comunes cuando se usan los microdrives:

1. Errores temporales de lectura

Este tipo de errores de lectura pueden ser causados por el ruido o las interferencias causadas por transiciones falsas durante la lectura de un bloque. Los ruidos pueden ser causados por partículas de suciedad que distorsiona temporalmente la señal cuando pasa la cinta por la cabeza de lectura. Cuando la cinta vuelve a pasar, la suciedad se habrá ido (si tenemos suerte) y se podrán leer los datos correctamente. Estos errores de lectura pueden ser causados también cuando los datos se han grabado mal y la señal de '1' se puede confundir con la de '0'. Estos errores se pueden recuperar normalmente - si no se pueden recuperar, será un error permanente.

2. Errores temporales de escritura

Los errores temporales de escritura ocurren cuando no se puede volver a leer un bloque que se ha grabado, pero reescribiéndolo, el bloque se hace legible.

3. Errores no detectados

Es posible que ocurran errores de lectura, pero que el 'checksum' esté correcto. La condición de error no puede ser detectada y se leen datos erróneos en memoria.

4. Errores permanentes

Los errores permanentes ocurren cuando hay defectos en la cinta (empalmes, suciedad o la capa magnética dañada). El procedimiento de formateo está diseñado para evitar el uso de las partes de la cinta sospechosas.

5. Entre unidades

Si un microdrive se ha formateado o escrito en una unidad, puede darse el caso de que no se pueda leer en otra.

6. Degradación

Después de un tiempo de uso de un cartucho, comienzan a incrementarse el número de errores temporales y permanentes. Esto es análogo a la degradación de la calidad del sonido reproducido en un cinta de casette que ha sido usada muchas veces. En este caso, los datos que queden deben ser copiados a un cartucho nuevo y desechar el viejo.

Precauciones con los errores

Se deben tener las siguientes precauciones para asegurarse que los datos se han almacenado correctamente en los microdrives:

1. Mapa de sectores en error

Con el procedimiento de formateo se crea un mapa de los sectores buenos. Cuando se formatea un cartucho, se escribe un bloque inválido dentro de cada sector. Después se verifican los sectores. Se han tomado muchas precauciones para que este proceso sea lo más fiable posible.

  1. Cuando se escriben los bloques de prueba, se escribe un bloque que es más largo que la longitud del bloque estándar. Estos bloques aseguran que si se reescribe un bloque en una unidad con velocidad de motor diferente, la longitud total ocupada por el nuevo bloque, ha sido comprobada.

  2. Cada sector es comprobado dos veces. Si ocurre un error en cualquiera de las comprobaciones, el sector en el que ha ocurrido será eliminado.

  3. El proceso de formateo escribe 255 sectores en orden decreciente. Los números bajos se escriben sobre los altos. Finalmente, cuando se escribe el sector 0, se encuentra cerca de él el sector más alto que no ha sido reescrito. Si estos dos sectores están muy cerca, puede causar problemas, por lo tanto el sector más alto disponible es eliminado también para asegurarse una buena fiabilidad.

2. Verificación de bloques

Cada bloque que se escribe, es verificado cuando pasa de nuevo por la cabeza (aproximadamente después de 7 segundos). Esto significa que los datos escritos permanecen en la memoria hasta que hayan sido verificados. Si falla la verificación, el bloque se vuelve a escribir en la misma posición.

3. 'Checksum'

Hay un 'checksum' de 16 octetos por cada cabecera y bloque de datos. Por lo tanto hay una posibilidad entre 65535 de que pase inadvertido un error de lectura.

4. Reintentos

El sistema operativo abandona la transacción, sólamente, después de 8 pasadas (detectadas en el sector 0) sin que se ejecute la operación satisfactoriamente. La operación de lectura se reintenta 8 veces, y la de escritura 4.


Anterior Tabla de contenidos Siguiente
Especificaciones de la ROM enchufable   Descripción de la pantalla