Conversión de una microcomputadora BBC (1981) en una grabadora de discos segura de $ 40,000



Introducción



Una de las historias de protección de disquetes más famosas proviene de Dungeon Master . Este juego, lanzado en diciembre de 1987, combinó el sofisticado formato de disco físico (bits difusos) con controles de seguridad encubiertos integrados en el propio juego.



Recomiendo leer este artículo , que proporciona una excelente descripción general de los disquetes, seguido de una descripción general muy detallada de la protección de bits difusos de Dungeon Master para Atari ST. También está este gran artículo que entra en más detalles sobre las historias que rodean la defensa del Dungeon Master. Contiene una cita de uno de los autores de Dungeon Master:



« , , 40 . , ».


La razón de este alto precio probablemente se debió a la precisión de tiempo requerida para crear bits difusos de manera confiable. En los días en que la mayor parte del mundo medía el rendimiento en microsegundos, la precisión requerida se medía en nanosegundos.



El BBC Micro tenía un procesador 6502 a 2 MHz y necesitaba dos ciclos de reloj, o 1 microsegundo, para ejecutar sus instrucciones más simples. ¿Hay alguna esperanza de que sea posible escribir bits difusos bajo tales restricciones? Veamos hasta dónde podemos llegar. Este trabajo se denominará "Proyecto Nutria Aceitada".



Para darle una idea del espíritu de la época, aquí hay una imagen de una duplicadora de disquetes de 3,5 ". Es sorprendente lo similar que es a una fotocopiadora, excepto que inserta discos en el receptáculo en lugar de papel. Parece que Advanced World Products incluso podría haberle vendido una máquina así .





Puerto personalizado BBC Micro



BBC Micro era conocido por su excelente extensibilidad, incluso a través del llamado "puerto de usuario". Este puerto está controlado por el adaptador de interfaz versátil 6522 que funciona a 1 MHz. El puerto en sí tiene 8 pines de datos y 2 pines de control. Estos contactos proporcionaron un alto grado de control. Los pines de datos se pueden configurar individualmente como entradas y salidas, y los niveles de los pines lógicos se pueden configurar en alto o bajo.



¿Por qué es importante para nosotros el puerto de usuario? Intentaremos controlar la unidad de disco directamente a través de ella. Al eliminar el controlador de disquete de la ecuación, es posible que podamos deshacernos de él y obtener un control más directo sobre la unidad de disco y los flujos de datos que se transfieren.





Puerto de usuario a unidad de disco



La imagen de arriba muestra mi cable que conecta el puerto de usuario a la unidad de disco. Los conectores son estándar y los cables que los conectan son solo puentes. Me esfuerzo sinceramente por crear algo que se pueda hacer "en esos días", por lo que no uso ningún dispositivo electrónico adicional.



El cable se organiza de la siguiente manera:





La principal conclusión de este diagrama es que la interfaz de la unidad de disco es probablemente más simple de lo que uno podría pensar. Podemos controlar la unidad de disco y consultar su estado importante en solo 8 pines. Todo es muy sencillo. Digamos que necesitamos hacer girar la unidad, entonces es suficiente para dar una señal baja a PB0 y PB1. Si desea esperar a que el disco gire al comienzo de la pista, entonces debe consultar el nivel lógico en PB6 hasta que veamos que el nivel de la señal cambia de alto a bajo. Para el movimiento paso a paso, es suficiente establecer el nivel lógico "paso hacia adentro" opuesto a "paso hacia afuera", y luego realizar una pulsación de una señal baja en el contacto "paso".



Hasta ahora todo va bien, tenemos un control básico sobre la unidad, pero aún no hemos grabado nada.



Problemas eléctricos



Es imperativa una breve digresión sobre los problemas eléctricos, porque me encontré con ellos. Conectar pares aleatorios de componentes puede hacer que funcionen, pero a veces se requieren ajustes. Aquí está el rango de voltaje observado inicialmente en el pin W / DATA del variador:





Estamos tratando de escribir pulsos en un variador con una frecuencia de FM de 250 kHz.



El voltaje de la lógica 1 es aproximadamente de 3.4 V y el voltaje de la lógica 0 es de aproximadamente 1.5 V. ¡Este es un problema serio! Los niveles de voltaje TTL aceptables están bien definidos:



“La señal de entrada TTL se considera 'baja' si tiene un voltaje entre 0 V y 0,8 V en relación con el pin de tierra, y 'alta' cuando está entre 2 V y VCC (5 V). Si se aplica una señal de voltaje en el rango de 0,8 V a 2,0 V a la entrada de un elemento TTL, entonces el elemento no da una respuesta específica y, por lo tanto, la señal se considera "indefinida" ".


Una tensión de 0 lógico de 1,5 V se considera "indefinida" y no provocará ninguna acción. De hecho, mi disco no estaba grabando nada con esta señal.



El problema se resolvió quitando el cable de la unidad de disquete EOL de la unidad . Aquí hay una foto de mi unidad con el conjunto EOL delineado en rojo:





Esto resuelve muy bien el problema de los niveles de voltaje, después de lo cual todo funciona. Parece que muchos de los puertos de BBC Micro, además del puerto de disco, no tienen suficiente energía para alimentar el cable EOL. Pero espere, ¿probablemente hubo alguna razón para instalar esta resistencia? Si. Eliminarlo tiene dos trucos:



  • Preste atención a la longitud de los cables. Sin una resistencia EOL, los cables largos son propensos a distorsionar la señal.
  • Esté atento a los niveles de voltaje en cables desconectados. Observé un voltaje de 1,32 V en el pin del actuador S / SEL (selección lateral). Esto no es normal porque este valor también se encuentra en el rango de incertidumbre TTL. ¿Dónde escribirá la unidad los datos? Quizás el lado superior, quizás el inferior. ¡O quizás ninguno de ellos en absoluto! El problema se resolvió conectando cada cable significativo y aplicándoles una señal alta o baja.


Necesita aumentar el ancho de banda



El problema que hemos pasado por alto hasta ahora: ¿cómo enviar una señal al pin W / DATA? Este es un contacto "duro". Tiene un gran ancho de banda y requisitos de sincronización precisos. Dejemos de soñar con bits difusos con precisión de nanosegundos por un segundo e intentemos escribir pulsos FM simples en la unidad.



La mayoría de los discos para BBC Micro están en FM (también conocido como DFM, también conocido como densidad única) codificados a 250 kHz. Grabar una pista de FM es bastante sencillo. Es necesario comprobar si la unidad está girando y si la tapa de registro está abierta. Después de eso, cada 4 microsegundos, o realizamos el rizado W / DATA a bajo y luego de regreso a señal alta (bit 1), o no lo hacemos (bit 0). La mayoría de las veces, cada segundo bit debe ser 1 (bit de sincronización para mantener el tiempo y la sincronización).



Controlar W / DATA a través de un procesador es una tarea inútil. 4 microsegundos son 8 ciclos de reloj del procesador; esto definitivamente no es suficiente para cargar un byte, cambiarlo, escribir 0 y luego 1 en los niveles lógicos del puerto de usuario. Un ciclo simple probablemente tomará más de 12 microsegundos, lo cual es demasiado. Entonces, para escribir W / DATA lo suficientemente rápido, tendremos que usar las capacidades del chip 6522 VIA.



Registro de cambio 6522 VIA



El candidato más obvio para nuestra tarea es un registro de turnos. El registro de desplazamiento es un registro de 8 bits. En el modo correspondiente, cargar el registro de desplazamiento obligará al chip a transmitir 8 bits secuencialmente en uno de los pines del puerto de usuario. Esto es genial: los bits se procesan en paralelo con el procesador principal, por lo que el procesador puede dedicar tiempo de forma segura a crear un nuevo conjunto de bits para comenzar a cambiar.



Desafortunadamente, no pude hacer funcionar este circuito. El único modo de cambio que tiene el potencial de funcionar con una rapidez razonable es el "cambio de reloj del sistema". La especificación Western Design Center 6522 tiene un buen esquema:





El reloj del sistema VIA es de 1 MHz, por lo que el reloj de compensación será de 500 kHz y la resolución de bits de salida es de 250 kHz. Esto es suficiente. Sin embargo, no he descubierto cómo hacer que el reloj de turno funcione de manera continua y sin problemas. Incluso después de intentar una sincronización precisa para recargar el registro de cambio, el intervalo de clavijas del reloj de cambio siempre se ve así:





Resulta que en un modo de cambio único lo suficientemente rápido para nuestros experimentos, la recarga del registro de cambio provoca un retraso antes de continuar con el cambio. No nos conviene.



6522 VIA Modo de salida de pulsos



Una característica poco conocida del 6522 es su "modo de salida de pulsos". No se describe en las especificaciones de todas las variaciones de 6522, pero aquí hay una pequeña entrada al respecto en la especificación de la tecnología MOS :





Finalmente hemos encontrado una especificación que describe con precisión su comportamiento. Este modo es muy interesante para nosotros, porque una operación de escritura en VIA promete llevar a dos acciones separadas: se aplica una señal lógica baja al pin de salida, y después de 1 reloj (1 microsegundo) vuelve a una señal alta sin esfuerzo de nuestra parte. Gracias a esto, podemos usarlo para impulsar la señal de salida de 250 kHz. Los recursos del procesador son muy limitados: el bucle no resolverá el problema de ninguna manera, pero el bloque de código lineal 6502 podrá hacer frente, por ejemplo:



        \ &70 points to &FE60, aka. user 6522 VIA ORB register.
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        LDA (&70),Y        \ 8 cycles, do not pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        ...


Funcionará. El procesador tiene suficiente potencia para esto. 8 ciclos de reloj son 4 microsegundos, que es el tiempo más corto entre pulsos de disco.



Desafortunadamente, tal operación es extremadamenteusa activamente la memoria. Cada bit de FM codificado requiere 2 bytes de código de línea 6502. Cada bit de datos significativo son dos bits de FM porque todos los demás bits están sincronizados. Una pista tiene 3125 bytes de longitud, por lo que se requieren 3125 * 8 * 2 * 2 == 100 kB de código de línea. BBC Micro tiene 32 KB de RAM, así que no tenemos suerte aquí. Se pueden escribir sectores únicos (pequeños), incluidos nuevos y potentes mecanismos de protección de disco. Pero no podremos escribir sectores grandes (1024 bytes) o pistas completas. Ambas operaciones son necesarias para escribir correctamente una gran cantidad de discos. Además, la resolución de los tiempos es de 1 microsegundo, lo que no es suficiente para grabar muchas protecciones y superficies de disco más complejas.



Podemos estar felices de haber logrado que al menos algo funcione, dadas tales restricciones, pero esta solución no nos conviene del todo.



Ayuda de un puerto de salida poco prometedor



Afortunadamente, hablo con gente inteligente como el Colectivo Bitshifters . (¡Ve a ver su última demostración, Evil Influences !) En una conversación sobre Slack, Tom Seddon (autor del emulador b2 ) sugirió ... usar el



cable adaptador de video a disco de salida de puerto RGB (?) ... no ves eso en Amazon todos los días.



Al principio me reí de esta idea, pero cuanto más lo pensaba, más probable me parecía. BBC Micro usa el chip de video 6845 para los tiempos . Como el 6522, es un procesador de mal humor, pero al menos sus características están bien descifradas gracias a la demostración de Bitshifters que explota sin piedad al 6845. Además, hice ingeniería inversa para obtener el emulador jsbeebemule correctamente Hitachi 6845. Echemos un vistazo al trabajo de Oiled Otter en este video, y luego cuéntenos lo que vimos:





Todo funciona gracias a la configuración inusual del chip 6845. El 6845 funciona a 1 MHz, y el tiempo de cuadro está configurado para tener una línea de trama a 32 microsegundos / 32 bytes por "cuadro". En cada salida de cuadro, los registros de la memoria de video del 6845 se sobrescriben para recuperar los siguientes 32 bytes de una ubicación potencialmente diferente. Es decir, cada 32 microsegundos, se selecciona un patrón de salida diferente de la tabla de patrones de salida. Configuramos los pines RGB para transmitir 8 píxeles por microsegundo, que son 256 por patrón de salida. Esto nos da una gran cantidad de posibles patrones de salida diferentes. Pero como estamos grabando fragmentos de 32 microsegundos de codificaciones de disco FM, solo unos pocos patrones son adecuados para nosotros. En 32 microsegundos, podemos ajustar 8 pulsos / bits de FM. Se sincronizarán 4 bits y, por lo general, todos son 1.4 bits serán bits de datos y solo hay 16 combinaciones de ellos.



Por ejemplo, si escribimos un trozo de datos 0x5, la salida de 32 microsegundos debería verse así:





Los datos de video tendrán el formato 00FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFF. El primero, segundo, cuarto y quinto 00 son bits de sincronización. Entre los bits de sincronización se encuentra el patrón de bits de datos 0101 o 0x5.



Las limitaciones de CPU y memoria están bien equilibradas. En última instancia, este circuito es similar al que probaríamos con el registro de desplazamiento VIA si funcionara: un pequeño coprocesador (chip de video) maneja la transmisión de un conjunto de bits de FM, y el procesador central es libre de cargar y proporcionar el siguiente patrón. Los requisitos de memoria son bastante razonables. Una tabla de los fragmentos de salida requeridos para 32 microsegundos, gracias a un modo de direccionamiento lineal especial, encaja bien en 1024 bytes. La lista de índices de búsqueda para toda la pista es de aproximadamente 12 KB, por lo que todo encaja perfectamente en los 32 KB de la RAM de BBC Micro.



Características de BBC Micro / 6845



Último carácter / columna 6845



Por supuesto, para que esto funcione, tienes que encontrar algunas características "divertidas". La primera es una característica del 6845, que hace que muestre negro para el último carácter de cada línea de mapa de bits. Esta es la maldición de los desarrolladores de demostraciones, y ahora parece que también de los investigadores de discos. Aquí hay una diapositiva de una charla reciente en la que demostré este problema:





A la izquierda hay un efecto de la demostración, arruinado por las barras negras verticales causadas por el problema del "último carácter / columna negra". Varias líneas de ráster 6845 caben en una sola pasada de ráster y, lamentablemente, aparecen franjas negras de forma involuntaria. Al controlar un disco, el efecto es mucho peor: las barras negras se reemplazan con pulsos no deseados, que se escriben en el disco.



La imagen de la solución se muestra a la derecha: la onda transmitida al disco simplemente se invierte. Ahora es normal que la última columna siempre sea negra (mostrada con un contorno naranja), porque allí siempre se requiere un cero. Estrictamente hablando, esto viola los requisitos de tiempo de algunas unidades de disco para señales pulsantes de W / DATA bajas. Aquí está el diagrama de tiempo para una unidad de esa época, un Mitsubishi M4852 / M4853 :





Según este esquema, el 0 lógico debería mantenerse hasta 2100 ns. Con una forma de onda invertida, espere 3000 ns o más. Sin embargo, las unidades que tengo solo se preocupan por la caída de los pulsos de datos, no por su duración. No es de extrañar. Hubo un par de trucos que podría haber hecho para evitar las peculiaridades del 6845 y asegurar que los tiempos de duración estén en línea con la especificación, pero resultó ser opcional, así que no lo hice.



DRAM



descomposición corrupción DRAM es una pesadilla. Ocurre cuando no actualizamos la DRAM a tiempo. Citando el artículo de Wikipedia sobre la actualización de la memoria :



"Este proceso se realiza automáticamente en segundo plano mediante un circuito de memoria electrónica y es invisible para el usuario".


Esto es cierto para los sistemas modernos, pero no para el BBC Micro. En BBC Micro, la actualización de DRAM es un efecto secundario del subsistema de video. Aprovecha la propiedad de que los modos de pantalla estándar atraviesan iterativamente todas las líneas DRAM en un corto período de tiempo. Probablemente ya haya adivinado a dónde va esto: nuestro modo de video especial, que se usa para generar cuadros a 32 microsegundos, no es el modo de pantalla estándar. No garantiza que pasará por alto todas las líneas de DRAM, por lo que se produce una corrupción de DRAM. La corrupción de DRAM no es una broma. Debido a la corrupción de DRAM no planificada, estaba perdiendo varios programas y contenido del disco. Te mostraré, para reírte, un programa BÁSICO que causa daño a la DRAM en solo una fracción de segundo:





Lo triste de la corrupción de la DRAM es que, si se le ocurre, puede perder datos fácilmente.



Por otro lado, si espera daños en la DRAM, generalmente puede evitarlo con facilidad. En el caso de Oiled Otter, hay varios ciclos críticos en los que el 6845 se encuentra en un estado inusual. Para guardar la actualización de la DRAM en cada uno de estos ciclos, funciona un incremento manual de recuperación de datos de la memoria.



Oportunidades abiertas



Ahora que tenemos un sistema de escritura de disco en funcionamiento que evita el controlador de disquete, ¿qué podemos hacer con él? En el video anterior, ya hemos demostrado su capacidad para grabar discos codificados en FM aleatorios.



Pero en este estudio tuvimos mucha suerte. Debido a las deficiencias del registro de desplazamiento VIA, tuvimos que buscar una solución con pines de salida de video y obtuvimos acceso a una resolución mucho más fina de los tiempos en el pin W / DATA . Estamos usando el MODE4 de una computadora BBC Micro con un reloj de píxeles de 8 MHz. Esto significa que puede generar píxeles en blanco o negro cada 125 ns cambiando los pulsos de escritura con una resolución de 125 ns... Si quisiéramos gastar un poco más de memoria extra (que tenemos) en tablas más grandes, podríamos usar MODE0, que usa un reloj de píxeles de 16 MHz, que proporciona una resolución de 62.5 ns. Me aseguré de que 125ns sea lo suficientemente bueno para todas las protecciones de disco probadas, pero es genial que todavía tengamos algo de margen de maniobra.



Protección de pistas largas



Mi protección de disco favorita es la protección de pistas largas. Ella era popular durante la Amiga... No creo que se haya usado nunca en BBC Micro. Me gusta la protección de pistas largas porque es muy fundamental: el controlador de disquete tiene mucha tolerancia para las diferentes velocidades de escritura (porque las unidades de disco giran a diferentes velocidades), pero solo escribe a una velocidad correcta.



La protección más compleja con pistas largas es escribir dos sectores en una pista, en la que uno de los sectores se escribe a una velocidad mayor. La verificación de protección de copia es el tiempo que tomó leer estos dos sectores. El sector escrito a mayor velocidad debería leerse mucho más rápido.



¿Puede Oiled Otter grabar tal pista? Sí, y bastante fácil. Dada la resolución de salida de 125 ns, es fácil crear múltiples entradas de tabla de salida similares a lo normal, pero con 125 nanosegundos recortados de cada 1 microsegundo. Aquí hay un video de cómo crear protección de pista larga y verificar las lecturas del disco:







Protección con bits difusos



Probablemente ya es hora de que volvamos al punto de partida: protección con bits difusos. ¿Puede Oiled Otter crear bits difusos en hardware de 1981? Intentemos. Aquí hay una imagen de los resultados de un par de lecturas de sector después de que fue escrito por el comando FUZZ del sistema Oiled Otter.





La instrucción FUZZ escribe el nibble 0x8 y el bit de datos se aparta progresivamente en incrementos de 125 ns. Esto es similar a la descripción de cómo se grabaron los fragmentos borrosos del Dungeon Master. Como puede ver en la captura de pantalla, los bytes de datos 0x88 pronto comienzan a leerse de manera incorrecta y no determinista. Pero la varianza no es 100% aleatoria como los bits débiles; la varianza es si el bit 0x8 se escribe lo suficientemente tarde como para tener la posibilidad de perderse. Si se omite, todavía podemos ver que hay patrones y lógica en esta locura.



Los resultados presentados anteriormente son una aplicación de los principios de los bits difusos a los datos codificados en FM. En la codificación FM, cada bit de datos se intercala con un bit de sincronización. Esto lleva al hecho de que a veces los bits de reloj se cuelan en el flujo de datos (consulte los bytes 0xFF en la primera ejecución; lo más probable es que sean bits de reloj). La defensa de Dungeon Master usa bits difusos junto con MFM. Esto conduce a una situación más simple en la que los bits difusos se mueven entre dos codificaciones válidas de bits de datos y no tocan los bits de sincronización. Por supuesto, Oiled Otter puede escribir MFM, GCR y cualquier otra codificación que se le ocurra. Todos estos son solo protocolos diferentes de una primitiva fundamental: la capacidad de transferir un pulso al variador en cualquier momento con buena resolución.



Para evaluarlo correctamente, daremos la vista de los bits difusos en el disco del osciloscopio. Los máximos son bastante desiguales, y cuando los dos pulsos están muy cerca el uno del otro (1 microsegundo más o menos, demasiado cerca para cualquier codificación estándar), la fuerza de inversión de magnetización reconocida por el controlador incluso comienza a disminuir.





Misión cumplida



Obtuvimos la capacidad de registrar pulsos de disco con una resolución de 125 ns. Esto es perfectamente suficiente para crear protecciones de disco complejas, incluidas pistas largas, bits débiles y bits difusos. ¡Nada mal para el hardware de 1981 con la velocidad de ejecución de comandos más rápida de 1 microsegundo!



Ver también:






All Articles