El semi ilusionario proyecto este, de crear un emulador (por hardware) de disquetera ocurrió cuando me planteé la siguiente pregunta: ¿Cómo puedo lograr que una computadora bootee sin disco duro, ni cdrom, ni disquetera, con el menor precio posible de componentes adicionales?
Entonces de golpe apareció la maravillosa oferta de: 128 MB de Compact Flash con enchufe IDE por U$S 15, razón por la cual tuve que tomar este valor como una cota para el costo del sub proyecto.
¿Qué metodos tiene una pc para bootear, sin cdrom ni disqueteras ni discos duros?
Aviso: Si a usted no le interesa entretenerse un poco, podrá saltearse esta sub sección y quedarse tranquilo de que no se perderá nada importante.
Si conoce alguna razón adicional por la cual no sea conveniente colocar discos duros en el techo, por favor, agregue su razón a la lista o envíemela por correo electrónico.
En un principio y para poder lograr el objetivo es necesario conocer a fondo el funcionamiento de uno de estos aparatos, y conocer entre otras cosas el significado de cada uno de sus conectores hacia la controladora de disquetes y del algoritmo que se usa para almacenar información en el disquete, el cual dependiendo del tipo del disquete este puede ser FM o MFM, los cuales pasaré a explicar a continuación.
Aquí va el significado de cada una de las patas del conector.
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 y 33) Son tierra (0v)
2) Este es el pin que usa la controladora para indicarle a la disquetera si el disco a leer tiene alta o baja densidad.
4) Por el momento no tengo idea de cual es el objetivo de este pin. Por lo pronto parece no ser usado por algunas motherboards inclusive, así que no debería tener ninguna relevancia a los efectos.
6) Ídem al 4.
8) Tras tratar de intentar averiguar en númerosos sitios el significado del pin me encontré con la realidad de que no existe tal explicación, y aún buscando información de los chips mi controladora alcanzados por este pin no pude encontrar información relevante.
10) Este pin pone el valor 0 lógico cuando se debería comenzar a girar el motor principal de la disquetera. Es importante que el PIC se conecte a este pin.
12) Solo se aplica a la segunda disquetera (/dev/fd1) por lo que no tiene mucho sentido emularla, tomando en cuenta el hecho de que las patas de un PIC son finitas y siempre terminan resultando insuficientes.
14) El emulador debería actuar solamente al encontrar un 0 en este pin, debido a que la controladora coloca un 1 lógico en este pin para seleccionar la segunda disquetera y un 0 para elegir la primera.
16) Ídem al 12.
Como dato adicional, yo tengo actualmente una controladora de disquetes ISA (la cual, aclaro, soporta disquetes de 3?), solo tiene conectado los siguientes pines: 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, y la tierra como la unión de todos los pines impares.
Aquí hay un proyecto de como emularon una disquetera de Commodore (la cual, tengo que aclarar que usa una interfaz serial): Emulador de disquetera de Commodore. Para que muchos incrédulos empiecen a ver que estas cosas se pueden realizar cuando hay ganas.
Recién encontré el datasheet de un controlador de disquetera, el cual explica detalladamente el significado de cada pin, el protocolo que se usa para comunicarse con la disquetera, etc: datasheet del FDC 37c699. Probablemente dentro de un tiempo resuma la información de este documento al wiki y me ponga a realizar pruebas con el puerto paralelo, software en tiempo real y algunas disqueteras que tengo, para ver a mano si puedo examinar el protocolo detalladamente.
Otro datasheet más: datasheet del Controlador 8277AA de Intel.
El proceso de emular una disquetera es un proceso de tiempo real, en el cual se necesita que haya un hardware dedicado a entregar una cantidad de datos de forma continua, con velocidad constante y con temporización exacta.
Una posibilidad podría ser agregarle una gran memoria RAM al PIC, capás de mantener el disco entero en memoria, o aún una pista. Aunque para minimizar los tiempos de acceso a la RAM es necesario accederla con un bus de datos grande (pero no demasiado).
Ahora bien, el ancho del bus de direcciones es dependiente no solo del tamaño en bytes de la pista del disco, también lo es del ancho del bus de datos entre la RAM y el PIC.
El disquete más pequeño emulable y al mismo tiempo compatible es el disquete de 5.25 pulgadas DS/DD, de 360Kb, o 500Kb sin formatear, el cual tiene 9 sectores por pista y 40 cilindros, que es en particular el tipo de disquetes más lento, y debido a que el PIC tiene una velocidad muy limitada, es conveniente tratar de emular este tipo.
Según datos especificados en las datasheets, en el tipo de disquetera antes mencionado hay que lograr una salida de 250Kbps, o visto de otra forma, hay que enviar un bit cada 4us = 4×10-6 segundos. Y teniendo un PIC de 1 MIPS, 1us por instrucción, hay que enviar un bit cada exactamente 4 ciclos… Lamentablemente en el PIC propuesto, ya la instrucción del salto del loop implica 2 ciclos, quedando libre para la entrada y la salida un saldo de 2 ciclos.
Recordando que un disquete de 360Kb sin formatear ocupa 500Kb, y considerando que tiene 40 cilindros y dos lados, queda entonces 6.25Kb por pista = 51200 bits. Y teniendo que una disquetera gira a 300RPM, o sea 5 revoluciones por segundo, hay que entregar 256000Kbit por segundo, lo cual es coherente al dato antes mencionado.
Una alternativa puede ser clockear al PIC a 20Mhz en lugar de los 4Mhz que viene con el clock por defecto, logrando así 5 MIPS, y que una instrucción demore tan solo 200ns, permitiendo que se ejecute hasta 20 instrucciones en 4us, siendo 4us el tiempo que hay que respetar para enviar cada bit.
Para alcanzar estas velocidades se está obligado a incrementar el ancho del bus de datos y de direcciones con la memoria RAM, sin olvidarse que el PIC propuesto solo tiene 16 puertos.
Y hay que tomar en cuenta otro detalle más; el tiempo que se tarda en realizar el proceso de lectura de la memoria RAM. Para reducir los tiempos de lectura a la memoria por microcontroladores es conveniente usar RAM Estática (SRAM) debido a que no se tiene que refrescar. A continuación menciono unos ejemplos de DRAM para poder contrastar:
Un ejemplo de una memoria RAM es La memoria M41256-15 de OKI, la cual según el datasheet tiene un tiempo máximo de acceso aleatorio dentro de la fila de 150ns, y demorando un mínimo de 260ns por ciclo de lectura o escritura aleatoria. También soporta acceso de página a 140ns por bit. Usar esta memoria complicaría mucho el diseño del circuito, por lo que usar esta DRAM económica podría terminar siendo una decisión costosa.
Otro ejemplo de DRAM es el HYB514256BJ-70 de Siemens, La cual consta de 256K × 4bits, y tiene tiempos de acceso mucho menores, 70ns para el acceso y 130ns mínimos para un ciclo de lectura o escritura aleatoria, con la opción de lectura por páginas a 45ns por nibble. Y aunque en esta memoria hay una ganancia en rendimiento la granularidad de la velocidad del PIC hace que respecto al chip de DRAM antes mencionado no haya grandes mejoras de velocidad. El handshaking para la lectura y escritura es practicamente el mismo.
Un problema adicional ya mencionado que aparece al agregar memoria DRAM externa al PIC es el tema de que la memoria DRAM tiene que ser refrescada. Una muy buena descripción de algunos modos de refresco están explicadas en este documento. Y aunque se podría hacer agregar un controlador de memoria, la complejidad del diseño aumentaría demasiado.
Otro tipo de memoria que se puede utilizar es la memoria SRAM, la cual a diferencia de la DRAM que está hecha con un condensador y un transistor por bit, la SRAM tiene 6 transistores por bit, un par para acceder al bit y otros cuatro para almacenarlo.
Para pequeñas cantidades de memoria (como es el caso del emulador de disquetera) los precios de la SRAM son menores que los de la DRAM, además se obtiene mayor velocidad por no tener que refrescarla, por tener un handshaking más sencillo y por tener tiempos de ciclo menores.
Por un tema de sencillez de diseño sería bueno no utilizar SRAM Sincrónica.
Un ejemplo de SRAM: La CY62128VLL-70ZAI de Cypress, es una memoria de 128K × 8bits, que se puede encontrar dentro de un celular TDMA Mitsubishi T-200. El datasheet habla por si solo, y vi en internet que el precio anda por los 3.72 dólares. El problema que tengo es que mi ejemplar de esta memoria está empaquetado en reversed TSOP I y es complicada de dessoldar… Ayuda!!!
Otro tema que se aplica a la SRAM es que el número de pines necesarios para poder direccionar 51200 bits más por lo menos un pin de bus de datos, es mayor que el número de entradas/salidas del PIC, en otras palabras, es inviable la SRAM para usarla con este PIC, a menos que se use un multiplexer del bus de direcciones, que es lo que tiene la DRAM. Dicho de otra forma, la ram dinámica divide el bus de direcciones en dos partes; en Filas y en Columnas, y coloca los bits en forma de matriz cuadrada de dos dimensiones de forma similar a la memoria de matriz de núcleo. Sin embargo si se usa este diseño se complica el handshaking y se disminuye la velocidad de acceso dado que el PIC tiene que realizar más instrucciones para lograr el ciclo de lectura/escritura.
Cuando encuentre otros ejemplos de SRAM los voy a subir, estudiar y comparar.
Probablemente continúe con la sección dentro de unos días.
Aclaro que este proyecto no está muerto. Simplemente le estoy dando mayor prioridad a avanzar en otros proyectos como el omr.