QL Programación Avanzada | ||
---|---|---|
Anterior | Siguiente |
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.
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:
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.
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).
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:
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 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 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.
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.
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.
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:
$00 | longitud del fichero |
$04 | clave de acceso del fichero |
$05 | tipo de fichero |
$06 | 8 octetos de información dependiente del tipo |
$0E | nombre del fichero (2 octetos de contador + caracteres ASCII) |
$34 | fecha actualizada (no implementada en QDOS V1.03) |
$38 | fecha de referencia (no implementada en QDOS V1.03) |
$3C | fecha copia (no implementado en QDOS V1.03) |
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.
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.
Descripción | # de octetos | tiempo | tiempo total |
---|---|---|---|
Preámbulo | 12 octetos | 480 µs | |
Cabecera sector | 14 octetos | 560 µs | 1040 µs |
Checksum | 2 octetos | 80 µs | 1120 µs |
Hueco 1 | 3600 µs | 4720 µs | |
Preámbulo | 12 octetos | 480 µs | |
Cabecera bloque | 2 octetos | 80 µs | 560 µs |
Checksum | 2 octetos | 80 µs | 640 µs |
Preámbulo | 8 octetos | 320 µs | 960 µs |
Registro | 512 octetos | 20480 µs | 21440 µs |
Checksum | 2 octetos | 80 µs | 21520 µs |
Hueco 2 | 5520 µs | 27040 µs | |
Total | 31760 µs |
Estos tiempos dan 225 + 5% sectores por medio.
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 octetos | tiempo | tiempo total |
---|---|---|---|
Preámbulo | 12 octetos | 480 µs | |
Cabecera sector | 14 octetos | 560 µs | 1040 µs |
Checksum | 2 octetos | 80 µs | 1120 µs |
Hueco 1 | >2840 µs (3600-10%-400 (longitud preámbulo)) | 2840 µs | 3960 µs |
Preámbulo | 12 octetos | 480 µs | |
Oct. form. (EE) | 610 octetos | 24400 µs | 24880 µs |
Checksum | 2 octetos | 80 µs | 24960 µs |
Hueco 2 | >2840 µs | 2840 µs | 27800 µs |
Total | 31760 µ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.
Estos son los errores más comunes cuando se usan los microdrives:
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.
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.
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.
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.
Si un microdrive se ha formateado o escrito en una unidad, puede darse el caso de que no se pueda leer en otra.
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.
Se deben tener las siguientes precauciones para asegurarse que los datos se han almacenado correctamente en los microdrives:
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.
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.
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.
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 |