Timex FDD - TOS. Sistema Operativo de Discos de Timex Computer. FDD Tambien llamado FDD 3 (debido a que venía como un sistema separado en tres piezas: la unidad de disco, el controlador y la fuente de poder) originalmente desarrollado por Timex Computer Corporation de EEUU, pero terminado de fabricar y producir por Timex of Portugal. El FDD fue pensado al principio como la alternativa TIMEX a los Microdrives para usarse con el T/S-2068, pero acabó siendo para el TC2048 o el TC2068. El sistema básico tenía 16k de RAM y un solo disco de 3", pero se le podía expandir a 64k y más discos, pudiendo entonces trabajar con el sistema CP/M. El controlador admite dos tipos de discos: uno con 40 tracks y 160K/lado, y otro de 80 tracks y 640K de capacidad. Todo el sistema es por sí solo casi un ordenador completo con su propio z80, RAM y dos puertos seriales de base. La interface incluye un botón de RESET además del que posse el controlador. TOS El sistema operativo de discos usado por el FDD es llamado TOS por Timex Operating System. Su sintaxis está pensada para emular hasta cierto punto a los Microdrives. La ROM BIOS no incluye ningún sistema operativo, éste se carga de un disco, del mismo modo que lo hacen el CP/M o el MS-DOS. El SO de Timex (a partir de ahora lo voy a llamar SOT por su sigla en español) permite usar el método de arbol para manejo de subdirectorios como el MS-DOS. El SOT usa los puertos RS-232 como dos ficheros o canales, así como trabajar con ficheros ya sea secuenciales ó directos. Una vez bootea el disco y el SOT se carga correctamente, aparece en pantalla el sigte. mensaje: (c) 1982 Sinclair Research Ltd (c) 1984 TIMEX - TOS V A.2 Sintaxis: comando *"camino: nombre .extensión" Los comandos son los siguientes: Format*, Cat*, List*, Load*, Save*, Merge*, Move*, Erase*, Let*, Attr*, Dim*, Input*, Restore*, Open#*, Close#*, Print*, Draw*, Goto*, Gosub*. El camino puede ser tanto un nombre de diskette o de subdirectorio. Se admiten hasta cuatro drives: a, b, c y d. El nombre es de hasta 8 caracteres sin la extensión. Todas las minúsculas en el nombre como en la extensión son automáticamente cambiadas a mayusculas al mostrarse en pantalla mediante CAT*. Eso nos dice que para el sistema, "prog1" y "PROG1" son el mismo nombre. La extensión consta del punto más tres letras. Las extensiones son solo referenciales y al gusto del usuario, a excepción de dos: .DIR - para subdirectorios .SCP - para puertos de comunicación serial. Los atributos de los archivos son: I - ocultar (el archivo no aparece en el directorio) P - protegido. U - desproteger. V - anula atributo de ocultar. Se admiten + y ? como wildcards específicados. Format* sintaxis 1: FORMAT *"drive" TO "nombre del volumen" Formatea y da el nombre al disco en el drive especificado. Ejemplo: FORMAT *"a" TO "disk1" sintaxis 2: FORMAT *"nombre{.ext}" Configura el protocolo para la comunicación por medio del puerto serial. El nombre solo puede ser "CH_A" o "CH_B" La extensión solo puede ser SCP y es omitible por defecto. Cat* sintaxis: CAT *{":"} CAT *":volumen" CAT *"{:volumen: {subdirectorio:}}nombre archivo{.ext}" Ejemplos: CAT *":disk1", CAT *":disk2:datos", CAT *"sdir1:prog.bas" CAT *":" muestra toda la información partiendo desde el directorio raiz del disco. Admite wildcards o comodines. List* Sintaxis 1: LIST * muestra la información del directorio en curso. Sintaxis 2: LIST * #{canal} Lista la información de un canal abierto específicamente. De omitirse el canal, listará todos los canales abiertos El canal debe ser un número entre 1 y 16. Save* Sintaxis: SAVE *"nombre" {LINE/CODE/DATA/SCREEN$} {n} SAVE *"{volumen:}{subdirectorio:} nombre{.ext}" Cuando el nombre ya existe, el SOT pregunta si se quiere sobre escribir o no el archivo. La opción {n} sobregraba sin preguntar al respecto. Ejemplos: SAVE *"opera.bas" LINE 1, Save *"image.scr" SCREEN$ n Load* sintaxis: LOAD *"{volumen:/subdirectorio:}nombre{.ext}" {CODE/DATA/SCREEN$} Merge* sintaxis: MERGE *"{volumen:/subdirectorio:}nombre{.ext}" Move* Sintaxis: MOVE *"nombre fuente" TO "nombre destino" MOVE *"{:vol1:/subdir1:}nombre1.ext" TO ":vol2:/subdir2:nombre2.ext" Permite copiar un archivo de un disco volumen1 a otro volumen2. O de un subdirectorio a otro. Admite wildcards. Ejemplos: MOVE *"amigo.bas" TO ":disk2:amigo.bas" - copia del disco por defecto al volumen "disk2" MOVE *"amigo.bas" TO "dir2:amigo.bas" - copia del directorio por defecto al subdirectorio "dir2" MOVE *"prb.dat" TO "prgbk.dat" - copia archivo en el mismo disco o sub directorio. MOVE *"name" TO ":ch_b" - envía archivo "name" a traves de un puerto b. MOVE *"ch_a" TO "ch_b" - transmite información de una computadora o terminal a otra. Nota: MOVE * no copia subdirectorios, solamente el contenido de estos. Erase* sintaxis: ERASE *"{:volumen:/subdirectorios:}nombre.ext" {n} ERASE *"{:volumen:}nombre" Erase siempre consulta si se desea eliminar o no el archivo. La opción {n} elimina sin preguntar. EjemploS: ERASE *"alpha:prg.bas", ERASE *"Alfa?.+" n Admite wildcards. Let* (Rename) Comando para renombrar los archivos. sintaxis: LET *"nombre viejo" TO "nombre nuevo" Ejemplo: LET *"code.bas" TO "Codigo.prg" LET *":empty" TO ":laser" - renombra el disco creado con FORMAT. Attr* Permite cambiar los atributos del archivo. sintaxis: ATTR *"nombre" atributo ATTR *"{:volumen:subdirectorios:}nombre{.ext}" p/u/i/v Ejemplo: ATTR *"copia+.+" p Admite wildcards. Subdirectorios y ficheros El punto fuerte del FDD es precisamente trabajar con subdirectorios y ficheros. Dim* Sintaxis 1: DIM *"nombre.dir" Permite crear un subdirectorio al igual que el comando MKDIR del DOS. Se debe añadir la extensión ".dir" si se quiere crear un subdirectorio, si se omite o se le da otra extensión, creará un archivo simple para usar con Open#*. Ejemplos: DIM *"nuevo.dir" - Crea subdirectorio "nuevo" DIM *"demo:dir1.dir" - Crea un subdirectorio "dir1" dentro de directorio "demo" Sintaxis 2: DIM *"nombre{.ext}" Solo se usa para crear un archivo que se usará con Open#*/Close#* en caso de que el archivo no exista. Ejemplo: DIM *"textos.dat" - crea archivo de datos de cadena Open#*/Close#*. Nota: usar DIM * con un nombre de fichero o directorio ya existente genera mensaje de error. Goto* sintaxis 1: GO TO *"camino" Es el equivalente al CD (Change Dir = cambio de directorio) del DOS. Ejemplos: GO TO *"^" - cambia el directorio un nivel hacia arriba. GO TO *"^^" - mueve el directorio dos niveles. GO TO *":" - va al directorio raiz(*) GO TO *"demo:fun:games" - salta a un subdirectorio dentro de otro sub directorio. GO TO *":demo" - salta a disco de nombre "demo" Sintaxis 2: GO TO *"drive"d Ejemplo: GO TO *"b"d - Cambia del drive por defecto al seleccionado en este caso el "B". (*) el directorio raiz muestra cuantas unidades de disco estan activas con su respectivo nombre de volumen y los canales SCP A y B. Es decir, no es el directorio raiz del disco puesto sino de todo el sistema de discos. Gosub* Sintaxis: GOSUB *{"camino"} GOSUB *"drive"d Actua parecido a Goto* pero permite volver al directorio desde el que se hizo el salto por medio de Draw* ya que usa un stack para almacenar el directorio en curso. Draw* con el sentido de "take back" (regresar) o "withdraw" (retiro, abandonar). Vuelve al subdirectorio o drive del cual se salió mediante Gosub*. DRAW * da error si se está ya en el directorio raiz. Open#* Sintaxis: OPEN# *canal;"{camino}nombre";modo{;longitud} canal: 1-16. nombre: puede ser un SCP o cualquier expresión de cadena pero no un directorio. modo: Hay cuatro modos posibles de acceso y solo se admite una letra. I,i - solo lectura modo secuencial (input). O,o - Solo escritura secuencial (output). A,a - permite añadir nuevos datos secuencialmente (append). R,r - Lectura y escritura en acceso directo (random files). longitud: Opcional, un número del 1 al 256. Define el número de bytes o caracteres que tendrá el archivo. La longitud no puede ser omitida cuando se está en modo R. El archivo debe ser previamente creado con el comando DIM* de lo contrario dará error. Solo permite almacenar cadenas. Los datos numéricos deben ser previamente convertidos a cadenas. Los canales del 1 al 4 son considerados rápidos. Poseen un bufer de 512 bytes exclusivos para cada uno. Los canales del 5 al 16 son llamados lentos debido a que comparten un único buffer de 512 bytes entre todos. Ejemplos: OPEN# *4;"file1.dat";i - abre para solo lectura. OPEN# *1;"alfa";o - abre el archivo en modo de escritura. OPEN# *5,"file1.dat";a - abre para añadir más datos al fichero OPEN# *3;"data";R;200 - fichero de acceso directo o aleatorio OPEN# *2;"ch_a";a - abre SCP "a" para solo escritura o envío. Nota: no existe INKEY$#, esta opción es reemplazada por: OPEN# *4;"file1.dat";i;1 - la cual lee con INPUT*# caracter a caracter del mismo modo que INKEY$#. Close#* Sintaxis: CLOSE# *´{canal} Close#* sólo sin parámetros, cierra todos los canales abiertos. En el caso del SCP, Close#* envía un ^Z como caracter de fin de archivo. Print* Sintaxis: PRINT *# canal; char$ {;AT n} Solo trabaja con cadenas. Admite el uso de separadores como Chr$13, Chr$6, ademas de "". Ejemplos: PRINT *#1;"amigo mio" - los espacios separan las palabras de la oracion PRINT *#3;a$+" "+b$+Chr$ 6 - similar al ejemplo anterior PRINT *#1; a$+Chr$ 13+"mio" - idem PRINT *#1;"amigo": PRINT *#1;"mio" - se salva como una sola cadena PRINT *#4;n$+b$ - como el ejemplo anterior PRINT *#1;"""Hola amigo""" - salva la frase entera PRINT *#4;n$+b$+p$+c$; AT xx - Escribe los datos en acceso directo al registro xx. Nota: como se ve por los ejemplos anteriores, la sigte. línea de Basic Microsoft... 60 PRINT#1,N$;","D$",";H$ - es imposible de tipear tal cual, hay que modificarla de acuerdo con los estándares del SOT ya vistos, siempre sabiendo que los ficheros secuenciales Microsoft son de longitud libre, los espacios no son separadores y así por el estilo. Input* Sintaxis: INPUT *# canal; var$ {;AT reg#} El canal debe ser 1-16. Solo admite variable de cadena normales o arrays unidimensionales. La opción {AT...} sólo se usa con la lectura de archivos directos. Ejemplo: INPUT *# 1;a$ (lectura secuencial) INPUT *# 2; v$; AT 5 (lectura de acceso directo al registro número 5 del archivo en cuestión) Nota: INPUT *# solo acepta una variable por instrucción. No existe la opcion LINE. OPEN# *4;"file1.dat";i;xx - donde xx= la longitud fija de la cadena a leer, afecta el resultado de INPUT*#. Restore* Sintaxis: RESTORE * canal Permite volver el puntero de un archivo secuencial a 1. En solo lectura se vuelve al comienzo del archivo. En modo 'append' o escritura, borraría todo lo antes escrito, pues empezaría totalmente desde cero nuevamente. En el caso del puerto serial, borraría el buffer de entrada de datos eliminando todos los bytes por leerse, si se está en modo de solo 'input' o acceso aleatorio o directo. No pasa eso cuando el SCP está abierto en otro modo. Comandos no documentados: Next* Sintaxis: NEXT * "pathname" Es el equivalente al comando PATH del MS-DOS. Pero solo admite un pathname por cada instrucción Next*. De hecho, ni siquiera parece ser admitida por la sintaxis de un SOT sin modificar. Format* ...d Sintaxis: FORMAT *"drive" TO "nombre del disco"d Esta opción es exclusiva para formatear discos de doble cara a 80 tracks, dando así 640k, en vez de solo los 160k habituales. Nota: ¡usarlo con unidades de solo 40 tracks puede dañar los cabezales! Configuración del SCP Cada vez que se usa "FORMAT ... SCP", el SOT hace las sigtes preguntas: 1. Text or Bytes (T/B) ? (¿texto o bytes?) 2. Auto line feed (Y/N) ? (¿avance de línea automático?) 3. XON / XOFF (Y/N) ? (habilita / desabilita protocolo X de software) 4. Input with wait (Y/N) ? (¿entrada de datos con espera?) 5. Baud rate (A-P) ? (¿rango de los baudios?) 6. Parity (E=Even, O=Odd, N=None) ? Paridad - E=par, O=impar, N=ninguno 7. Stop bits (A=1, B=1.5, C=2) ? - bits entre final y comienzo de bytes 8. Bits/char (A=5, B=6, C=7, D=8) ? - bits de cada byte de dato La opción 5 solicita elegir una letra que equivale a un valor en baudios de trasmisión: Letra Baudios (bits/seg.) A 50 B 75 C 110 D 134.5 E 150 F 200 G 300 H 600 I 1.200 J 1.900 K 2.400 L 3.600 M 4.800 N 7.200 O 9.600 P 19,200 Los valores por defecto son: 1 : Bytes 2 : No auto line food - No al avance de línea automático 3 : No X ON / X OFF 4 : Input operation with wait - operaciones de entrada con espera 5 : 1200 baud 6 : No parity (none) - cero paridad 7 : 1 stop bit - 1 bit al final 8 : 8 bits per character - 8 bits por caracter Nota: Es posible usar Save*, Load*, Merge* y Move* para intercambiar archivos con el SCP Ejemplo: SAVE *":ch_a" LINE 10. Opción de auto arranque Cuando se enciende o resetea el FDD, el sistema busca cargar el SOT del disco y si lo hubiera, también ejecuta el programa de auto arranque en BASIC diseñado por el usuario con nombre "START". Si no lo encuentra, simplemente bootea solo el SOT. Utilidades El sistema venía con un disco de utilidades varias: Backup - programa para copiar discos enteros Losys - permite actualizar el SOT sin perder los datos del disco Dump - muestra en pantalla los bytes en hexadecimal y ASCII de un archivo dado Lprint - deriva los comandos LPRINT y LLIST a una impresora conectada al serial A. Captura de errores Es posible atrapar errores mediante dos variables del sistema y así hallar el fin de fichero (EOF) por ejemplo. Las variables son TRAP (23729) y SYSERR (23728), es decir, atrapar y error del sistema. Son el equivalente SOT a ON ERROR y ERR. Programa ejemplo: 50 LET trap=23729: LET syserr=23728 100 OPEN #*1;"nombre";I 110 POKE trap,255 120 INPUT *#1;a$ 130 If PEEK syserr<>0 THEN GO TO 500 140 PRINT a$ 150 GO TO 120 500 PRINT "Llegó al final del fichero" 510 CLOSE #*1 El error 72 se da cuando se lee más allá del fin de fichero. Para desabilitar la captura de errores usar POKE 23729,0 Mensajes de error: 30 ILLEGAL PATHNAME - el nombre de disco o directorio no es valido 31 NON EXISTENT PATH - No existe el camino 32 ILLEGAL USE OF A ROOT NAME - El uso del nombre raiz no es valido 33 <> HAS WRONG TYPE - ... Es de tipo erroneo 34 <> DOES NOT EXIST - No existe ... 35 <> ALREADY EXIST - Ya existe ... 36 TYPES DO NOT AGREE - Los tipos no son compatibles 37 TEMPLATE NOT ALLOWED - No se permiten comodines 38 NO FILES MATCHING THE TEMPLATE - Ningún archivo encaja con los comodines usados 39 DIRECTORY FULL ON DISK <> - El directorio está lleno en el disco ... 40 DISK <> FULL - Disco ... lleno 41 NO ROOM FOR FILE IN CHANNEL <> - Sin espacio para archivo en canal ... 42 <> IS WRITE PROTECTED - ... está protegido contra escritura 43 DISK <> IS SOFTWARE W/P - El disco ... esta protegido contra escritura como software 44 DISK <> IS HARDWARE W/P - El disco ... está protegido contra escritura en hardware 45 <> HAS DIRECTORIES - ... tiene directorios 46 <> HAS FILES OPEN - ... tiene archivos abiertos 47 <> HAS FILES W/P - ... tiene archivos protegidos contra escritura 48 CANNOT ERASE CURRENT DIRECTORY - No se puede borrar directorio en curso 49 CANNOT CREATE MORE DIRECTORIES - no se pueden crear más directorios 50 ILLEGAL DIRECTORY SPECIFICATION - Especificaciones ilegales de directorio 51 DIRECTORY STACK OVERFLOW - Se excedió el "stack" del directorio 52 CANNOT RETURN FROM LEVEL 0 - No se puede retornar desde nivel 0 53 CHANNEL BUSY - canal ocupado 54 CHANNEL NOT OPEN - Canal no abierto 55 ILLEGAL CHANNEL NUMBER - Número de canal no válido 56 NO CHANNELS OPEN - No hay canales abiertos 57 NO CHANNELS FREE - no hay canales libres 58 NO FAST CHANNELS FREE - Ningún canal rápido libre 59 CHANNEL TABLE OVERFLOW - Excedió la tabla de canales 60 ILLEGAL MODE/TYPE COMBINATION - Combinación modo/tipo no valida 61 ILLEGAL RECORD LENGTH - Longitud de registro no válida 62 CANNOT USE A SLOW CHANNEL - No puede usarse un canal lento 63 <> IS OPEN - ... está abierto 64 <> CHANGED WITH FILES OPEN - ... modificado con archivos abiertos 65 CANNOT FORMAT WITH FILES OPEN - No es posible formatear con archivos abiertos 66 ILLEGAL DRIVE NAME - Nombre de unidad no valido 67 ILLEGAL DISK NAME - nombre de disco no válido 68 BUFFER FULL - Búfer lleno 69 SCP I/O ERROR - error en la entrada/salida del SCP 70 ILLEGAL OPERATION ON WRITE FILE - operación no válida en la escritura de un archivo 72 READ PAST END OF FILE - Se leyó más allá del final del archivo 73 HARDWARE FAULT ON DISK - Falla en el hardware del disco 74 DISK CORRUPTED - disco dañado 75 ILLEGAL DATA TYPE - Tipo de datos no válido Otros equipos con SOT: FDD 3000 Sistema de discos producido por Timex Computers de Portugal. Fue el sucesor del FDD 3 y se vendió en Portugal y Polonia. Fue diseñado para el TC2048, TC2068 y Unipolbrit 2086. Funcionaba también con el original ZX Spectrum 48K/+/128K y clones. Hubo una versión modificada para que funcione con el +3 y +2a. Se ofrecía con un disquete de 3" conteniendo el SOT y otro con el CP/M. En un solo CASE venía el controlador, la fuente y dos unidades de 3", procesador z80, 64k de RAM, dos puertos RS232 y una toma de video compuesto más botón de RESET. El case era tan sólido que podía aguantar el peso de un monitor encima suyo. INVESDISK 200 En España, Investronica ofreció el Invesdisk 200, que no era otra cosa que el FDD 3 de Timex con el logo cambiado. Fuera de unos avisos y algo de info en las revistas ZX y Microhobby, no tuvo mucha difusión, ni se vendieron demasiadas unidades. Imagino que al SOT lo renombrarían INVESDOS. Zebra FDD System En los EEUU, Timex sinclair nunca sacó a la venta el FDD, este fue importado de Portugal a Norteamérica por la empresa Zebra Systems, pero con carcasas color plateado e interfaces adaptadas para el T/S-2068 y con la etiqueta cambiada como Zebra FDD, excepto el 3000 que solo fue renombrado como Zebra FDD 3000. Su sistema fue renombrado como Zebra DOS. Unipolbrit's FDD 3 En Polonia, la empresa Unipolbrit metió todo el FDD en un sólo módulo, cuyo aspecto era muy distinto al del 3000. También ofrecieron el 3000 con muy poquísimas modificaciones. FDD 6000 Terceras partes modificaron el 3000, reemplazando las unidades de 3" por unas de 5.25" llamandolas por eso 6000. Stavi creó una versión de 5.25" la cual requería de una carcasa más larga pero de menor calidad al original. Debido a eso, era imposible ponerle encima un monitor. Unipolbrit ofreció también su FDD 6000 con dos unidades de 5.25" de solo 40 tracks a doble cara y un switch para elegir cual cara del disco usar, debido a que estos no pueden ser volteados como los Hitachi de 3". TC-3256 La última computadora creada por Timex Portugal pero que nunca fue sacada al mercado, la TC-3256 era el sucesor directo del TC-2048 y 128k+, o más bien la suma de ambos, pero con 256k de RAM y conector directo al FDD o FDD 3000. Otros sistemas para el FDD: SOT Q.2 Es un sistema A.2 parchado para FDD3/3000 modificados, adaptado para 2068, 128k y +3. Corrige la sintaxis de NEXT *, que en el SOT original no tenía función alguna, debido a un error en la tabla sintáctica. SOT V 4.00 Creado por Wise Man, es plenamnete compatible con el software y comandos del SOT A.2, pero con monitor HISOFT incorporado y facilidades para usar la RAM extra del FDD. Carga al inicio todo el "boot disk" y fichero "start" junto con algunas utilidades a la RAM, debido a esto, formatea los discos sin la necesidad de poner el sistema en el disco a diferencia del SOT v A.2, pero no opera con discos de 80 tracks, así que los formatea como discos de 40 tracks, simple cara con capacidad de 164k. En suma, una buena alternativa en caso de seguir usando discos de 3", pero no, si se quiere aprovechar la capacidad de los discos de 3.5" o 5.25". SOT Q.4 Una versión modificada del A.4 creada por Jarek Adamski. CP/M El FDD venía solamente con un disco conteniendo el SOT, había que ampliar su RAM a 64k para poder recien instalarle el CP/M. El FDD 3000 en cambio venía ya con 64k, el SOT y el disco con CP/M 2.2. Desde el Spectrum o TC había que ejecutar primero el Monitor Emulador y una vez cargado este se ponía el disco del CP/M para que se ejecutase. La tecla CONTROL era suplida por el modo E, o tecla EXT. TT3000 El FDD 3000 podía usarse independientemente del Spectrum, como una máquina exclusivamente CP/M si en su lugar se le conectaba un teclado de Timex llamado TT3000 o Timex Terminal 3000, la cual era por si sola otra computadora, pues también tenía su procesador z80, RAM, ROM e interfaz incorporada. En este caso solo puede usarse un monitor de video compuesto y el CP/M opera entonces en 80 columnas. ZXVGS Creado por Jarek Adamski, no solo para los sistemas de TIMEX, sino también para MB-02+, +3, +D, Pentagon, Scorpion, Sam Coupe, Unipolbrit y el emulador Warajevo para PC. Permite correr el CPM22QED, una versión de CP/M que es compatible con la v 2.2 y parcialmente con el Plus. Para cerrar: En lo que a Timex se refiere, este era el sistema oficial para sus modelos 2068, 2048 y Unipolbrit. En lo que al Spectrum se refiere, era solamente una alternativa más entre muchas otras, ya que en esas fechas existían los sistemas Discovery de Opus, Trdos, SwiftDisk, etc etc. Si se hubiese producido y vendido junto con la T/S-2068, la historia quién sabe, hubiese sido otra, ya que el CP/M le daba al Spectrum acceso al software profesional de base, como Word Star o Dbase II. Francisco León. (última actualización 2020) zx_if1@hotmail.com