TR-dos v. 5.xx. Sistema operativo de Digital Research Ltda. para la Interfase Beta 128. Versión mejorada del Betadisk. Sintaxis: comando "[drive:] nombre" [tipo] Comandos: Format, Cat, List, Load, Save, Merge, Verify, Move, Erase, New, Copy, Poke, Peek, Goto, Return, Run, *, 40/80. Open#, Close#, Usr, Randomize ...: Rem... Los drives admitidos son: "a:", "b:", "c:", "d:" (tanto en mayúsculas como en minúsculas). El nombre es de hasta 8 caracteres ya sean mayúsculas, minúsculas, incluido espacios. Se pueden escribir nombres de hasta 10 caracteres pero el Trdos ignorará los dos últimos caracteres. EL DOS diferencia los nombres con mayúsculas de aquellos en minúsculas. Por ejemplo: "QUOTE" es distinto de "quote" y "QuotE" o "qUOTe". Los archivos son catalogados de la siguiente manera con una letra designando el tipo: B - para programas en basic. C - para codigo máquina (bytes CODE), Screen$, snapshots. # - para accesos directos o secuenciales (archivos tipo OPEN#). D - para archivos DATA No hay atributos ni extensiones. Se puede acceder a los comandos del DOS desde tres modos: modo TRdos, modo SOS (Basic) y desde CM (código máquina) Modo Trdos: Para entrar en este modo desde el Basic, hay que usar el comando directo: Randomize Usr 15616(*) En este modo se aceptan todos los comandos del DOS, los cuales pueden teclearse directamente, cualquier otra sentencia o símbolo será ignorado. El prompt del cursor pasa a "A>" (la unidad por defecto en uso) y espera una orden de DOS. (*) Este valor varía dependiendo de si se usa el Beta 128 con un ZX Spectrum con ROM original, o con ROM modificada. 40/80 (tracks) Algunas de las antiguas unidades de 40 tracks no tienen señalizador de final y auto detención por lo que el autochequeo no funciona. Es decir el TRdos lo considera como una unidada de 80 tracks. 40 = este comando directo le informa al sistema que la unidad seleccionada es de 40 tracks. 80 = permite seleccionar la unidad de 80 tracks como unidad por defecto. * (select drive) sintaxis: *"" Permite seleccionar o cambiar la unidad por defecto. Los comandos del Trdos operan generalmente con la unidad por defecto. Format sintaxis: Format "[drive:]nombre del volumen" Ejemplo: Format "a:disk1" El comando formatea en doble lado pero si se desea formatear en lado simple, entonces el primer caracter del nombre ha de ser "$". Ejemplo: Format "$disk0" Cat sintaxis: Cat [#flujo,]["drive"] Ejemplos: Cat - solo muestra la información del disco en la unidad usada por defecto. Cat "b:" - muestra el contenido del disco en el drive b. Cat #4 - envía los datos hacia el canal abierto con Open#. Cat siempre muestra los datos en dos columnas. List sintaxis: List [#flujo,]["drive"] Muestra los datos al igual que CAT pero de un modo más detallado y en una sola columna. Ejemplo: List #5,"c:" Nota: drive ha de ser siempre una letra (a,b,c ó d) más ":", otras letras distintas más ":", dan error. Cualquier expresión que no sea una letra de drive identificable será ignorada, por ejemplo: "b*" o "b" no es igual a "b:". Así Cat "bx" o List "m*" darán el catalogo del disco por defecto. Pero Cat "m:" dará error. Save Sintaxis: Save "[drive:]nombre" [Line/Code/Data/Screen$] Cuando el nombre ya existe el Trdos informa que el archivo ya existe y no ejecuta la acción de salvar. Desde el Basic en cambio no muestra mensaje alguno, simplemente no salva nada. En cualquier caso se salva con otro nombre, o se borra el archivo previo con Erase. Load sintaxis: Load "[drive:]nombre" [Code/Data] Nota: Una pantalla puede ser salvada con Save... Screen$, pero debe ser cargada solamente con Load... Code. Merge sintaxis: Merge "[drive:]nombre" Verify sintaxis: Verify "[drive:]nombre" [Code/Data] Run sintaxis: Run "[drive:]nombre" [Code] Permite cargar archivos como Load, pero puede ejecutarlos aun si no hubieran sido salvados con Save... Line. Run sin parámetros carga archivo Autoload "boot" siempre y cuando exista en el drive por defecto en uso. Move (Packing Disc Space) Permite liberar el espacio ocupado por los archivos borrados con Erase, para su futuro uso. sintaxis: MOVE ["drive"] Ejemplo: MOVE "b:" compacta disco en la unidad "b". Si se omite el drive, MOVE compacta el disco en la unidad por defecto. Despues de usar Move, Cat deja de mostrar el número de archivos borrados pues estos han sido plenamente eliminados. Nota: Se recomienda trabajar siempre usando la unidad "a:" por defecto y solo desde el Trdos, nunca desde Basic. El manual original también sugiere usar Move despues de cada Erase para facilitar los reajustes multiples en directorio. Copy Sintaxis1: Copy "[drive1:]nombre_1","[drive2:]nombre_2" [Code/Data/#] sintaxis2: Copy S "nombre2" [Code/Data/#] sintaxis3: Copy B sintaxis4: Copy "*","*" donde: S/s = copia los datos con una sola unidad de disco B/b = se usa para hacer backups del disco mediante una sola unidad nombre_1 = el nuevo nombre de la copia nombre_2 = el nombre del archivo original a copiar drive1 = la unidad en la cual se hará la copia drive2 = la unidad en la cual está el archivo a copiar # = archivo de tipo Open#/Close# Si drive1 y drive2 se omiten, el archivo es copiado en la unidad por defecto. COPY necesita que se le especifique el tipo de archivo a tratar de lo contrario devuelve error. Ejemplos: Copy "b:amigo","amigo" - copia "amigo" del drive por defecto al drive especificado "b" Copy "prb.c","prgbk.c" CODE - copia archivo CODE en el mismo disco. COPY s "Wines" - solicita el cambio de dico para hacer la copia en la misma unidad Copy b - solicita cambio de disco para hacer el backup. Cualquier caracter después de "Copy b" será ignorado. COPY "B:*", "A:*" - permite hacer backup con dos unidades (*). Es el único caso en que se usa un signo comodín: "*". Si el archivo ya existiese, el TR-dos pregunta si se desea sobreescribir o no el archivo. Si se responde con "N", en caso de backups, se prosigue con el copiado pero sin sobreescribir los duplicados que encuentre. (*) es necesario estipular de que drive a que drive se ha de hacer el backup. Erase sintaxis: Erase "[drive:]nombre" [Code/Data/#] Ejemplo: Erase "a:prg.p", Erase "Alfa" # Nota: La ausencia de comodines (wildcards) en este comando lo obliga al usuario a borrar los archivos uno por uno. O usar Format si se quiere borrar todo el directorio. New (Rename) Comando para renombrar los archivos. sintaxis: New "[drive1:]nombre_1","[drive2:]nombre_2" [Code/Data/#] donde: nombre_1 = el nuevo nombre del archivo nombre_2 = el nombre original del archivo drive1 y drive2 deben ser iguales, si se omiten se renombrará el archivo en la unidad por defecto. Ejemplos: New "code.bin","Codigo.b" Code - renombra archivo tipo Code en la unidad por defecto. New "c:code.bas","c:Codigo.a" - renombra archivo Basic en la unidad "c". Nota: El manual original recomienda usar este comando preferiblemente desde el TRdos y no desde el Basic. También se recomienda usar preferiblemente la unidad por defecto (generalmente "a:") para trabajar con este comando. Poke Permite escribir sectores de datos de la RAM en cualquier parte de un archivo del disco. Sintaxis: Poke "[drive:]nombre" Buff_add, Sec_nums Ejemplo: Poke "B:OLD" 30024,10 Nota: Esta instrucción debe ser usada con cuidado debido a que modifica el contenido de un archivo en el disco. Peek Permite leer partes de archivos en disco y los transfiere a la RAM. Solo se puede leer un sector a la vez. Sintaxis: Peek "[drive:]nombre" Buff_add, Sec_numb. Ejemplos: Peek "a:record" 32768,5 Peek "datel.p" varnum1, varnum2 Goto sintaxis: GOTO "juego"CODE Equivalente a RUN y LOAD, pero para cargar snapshots de juegos. Snapshots: Al igual que el Disciple y Plus D, el Beta 128 también tiene un botón para salvar snapshots de 48k y 128k. Se requiere un disco en blanco previamente formateado en la unidad A para hacer los snapshots. En un Spectrum 48k o +, solo puede crearse un archivo por juego, pues se salva un bloque entero de 48k. En un 128k, se pueden crear hasta 7 archivos para salvar un juego, dependiendo de que se usen o no, más de 64k. Un snapshot siempre será de tipo y tendrá "@" por nombre. Ha de ser renombrado o copiado luego. Ejemplos: GOTO "@"CODE NEW "game1", "@"CODE COPY "B:game1", "A:@"CODE GOTO "game1"CODE Algunos programas usan rutinas de lectura no estandarizadas, en este caso se requieren discos con nombre empezando con "$". El prefijo "$" debe entonces usarse con todos los nuevos nombres del snapshot. Ejemplos: GOTO "$game1"CODE NEW "$game1", "@"CODE Antes de hacer cada snapshot hay que verificar que no haya ningún archivo anterior "@", si lo hubiera, debe renombrarse, para continuar haciendo nuevos snapshots. Return Permite salir del modo Trdos y devuelve el control al Basic. Nota: este comando no funciona si se usa el Beta 128 con roms modificadas tipo Plus 4, debido a la tokenización. Es decir, el "token" RETURN funciona, pero "r"+"e"+"t"+"u"+"r"+"n", tecleado letra a letra, no es aceptado y no retorna. Modo SOS: Standard Operating System (SOS = sistema operativo estandarizado del Spectrum) Es el sistema (ZX Basic) por defecto al prender un 48k ó + (o el modo Basic que se elige en un 128k). Para acceder a los comandos del DOS desde el Basic se requiere la siguiente sintaxis: [número de línea] Randomize Usr 15619: Rem: Generalmente todas las sentencias del DOS pueden ser usadas como comandos directos o sentencias dentro de un listado Basic. Ejemplos: Randomize Usr 15619: Rem:*"b:" Randomize Usr 15619: Rem: Cat "c:" Randomize Usr 15619: Rem: Load "opus" Randomize Usr 15619: Rem: Copy "prb.m$","prgbk.m$" DATA Randomize Usr 15619: Rem: Merge "b:hunos" Nota: No puede haber más de un comando del DOS por línea admisible. Los siguientes comandos deben ser usados solamente dentro de programas Basic: Open# Los canales 0 - 3 están reservados. Trdos solo puede usar los canales del 4 al 15. Cada vez que se abre un canal, el sistema requiere el uso de 336 bytes de la RAM libres. Ficheros secuenciales: Sintaxis: Open# ,"[drive:]fichero"[,/;] Permite manejar datos numéricos y cadenas de modo secuencial. Ejemplo: Open# 4,"file.dat",R - abre para solo lectura. Permite el uso de Input# e Inkey$# . Open# 4,"a:alfa",W - crea el fichero "alfa" sino existiera y pasa a modo de escritura. Permite el uso de Print# Nota: Un fichero debe ser abierto ya sea en modo escritura o lectura, pero no en ambos a la vez. List#, Llist# y Lprint# también pueden ser usados en un fichero tipo Open#...W. Print# sintaxis: Print #n; El único separador válido entre elementos a salvar diferencialmente es chr$ 13 ó "'". Chr$ 6, "," y ";" salvan los datos como un todo. Input# sintaxis: Input# n;<[Line]a$/var... [;# n;...]> Solo se admite una variable de lectura asociada a un canal y ";" como separador de variables de lectura. "," da error. Ejemplos: Print #4;"amigo",100 y Print #4;100;"amigo" - tratarán los datos como una sola cadena a leerse con Input #4;x$. Print #4;"amigo"'100 y Print #4;100'"amigo" - sí pueden leerse indistintamente con: Input #4;a$: Input #4;n e Input #4;n: Input #4;a$ - ó con: Input #4;a$: Input #4;n$ (el TRdos salva los números de modo que se lean indistintamente ya como número o cadena). Print #4;100'"amigo" - de hecho es igual a: Print #4;100: Print #4;"amigo". Print #5;a$;b$;c$'d$ ó Print #4;a$+b$+c$'d$ - es aceptado. El apóstrofe (') equivale a fin de linea. Así a$;b$;c$ ó a$+b$+c$ serán leidos por un Input y d$ por otro. Input #5;a$;b$,c$'d$ - por el contrario devuelve error. Debido a que Input# solo admite una variable de lectura por canal, para el ejemplo anterior se requeriría: Input #5;x$: Input #5;y$ ó Input #5;x$; #5;y$ Nota: no existe señal de fin de fichero (EOF). Si se pasa del EOF, obtenemos el error 8 propio del Basic. Para obtener un fin de fichero es necesario que el último dato a salvar sea una marca elegida por el usuario como "zzz" o CHR$ 0. Otra opción es usar una rutina de captura de errores de Basic, como el On error del Betabasic. Ficheros directos: sintaxis: Open# ,"[drive:]fichero"[,/;]RND, Almacena los registros contando desde cero en adelante. La longitud máxima es de 254 bytes por registro. Ejemplo: Open# 4,"file.rnd" RND,100 - abre o crea "file.rnd" para acceder a él aleatoria o directamente. Para acceder a los registros de un fichero aleatorio se usan también Print# e Input# pero con la siguiente sintaxis: Print# ;, Input# ;<(registro)>,<[Line]a$ / var.> - en este caso, el registro debe estar siempre entre paréntesis. Nota: Hay que respetar la sintaxis para evitarse errores. Mientras que en la mayoría de comandos la coma (",") es obligada (no puede ser reemplazada por espacio o ";"), en Print# o Input# el ";" inicial es irreemplazable. Es decir el sistema admite "Print #4;n$" pero nunca "Print #4,n$". Close# Sintaxis: Close# Cierra el canal abierto. De no cerrarse el canal, todos los datos del fichero se perderían irremediablemente. Ejemplo de fichero secuencial: 10 LET DOS = 15619 20 RANDOMIZE USR DOS: REM: OPEN #4, "TEST",W 30 PRINT #4; "This is a test line" 40 RANDOMIZE USR DOS: REM: CLOSE #4 10 LET DOS = 15619 20 RANDOMIZE USR DOS :REM :OPEN #7, "TEST",R 30 INPUT #7; A$ 35 PRINT A$ 40 RANDOMIZE USR DOS: REM: CLOSE #4 Nota: no es necesario usar Randomize usr... o Let... usr... con Print#, Input# ni Inkey$#; solamente con Open y Close. Ejemplo de fichero aleatorio: 100 RANDOMIZE USR 15619: REM: OPEN #12, "TEST1"RND, 20 110 PRINT #12; 20, A$ : : 570 INPUT #12; (15), A$ : : 990 RANDOMIZE USR 15619: REM: CLOSE #12 999 REM END Nota: como muestra el ejemplo es posible leer y escribir a la vez en un fichero aleatorio. Modo CM: Es relativamente simple incluir las rutinas del Trdos en programas en código máquina. Tres son los elementos requeridos por el programa: 1) el codigo máquina equivalente del comando TRDOS en Basic. 2) la subrutina en c.m. para ejecutar lo antes dicho. 3) la rutina c.m. que restaurará el sistema a su estado original antes de la llamada y ejecución del comando. Las posiciones reales de memoria a usar dependen del programa como un todo. En el ejemplo siguiente las rutinas se localizan en 49000 para SAVE, 49500 para LOAD y 50000 para la rutina de llamada. Así el elemento 1 estará en 49000 o 49500, mientras los elementos 2 y 3 estarán a partir de la 50000. Ejemplo: Dirección Codigo Basic Comentario 49000 234 REM Codigos del Apendice A del manual del Spectrum 49001 58 : 49002 248 SAVE 49003 34 " 49004 69 E 49005 120 x 49006 97 a 49007 109 m Nombre de archivo: "Example" 49008 112 p 49009 108 l 49010 101 e 49011 34 " 49012 13 ENTER Siempre debe terminar con ENTER La rutina para LOAD comienza en 49500 y es exactamente igual con la excepción de que en 49502 habrá un 239 (LOAD) en vez de 248 (SAVE). Estas dos rutinas pueden ubicarse en cualquier parte, pero la rutina de inicio en la 50000 requerirá modificar 50007-50008 (dirección de SAVE) y 50025-50026 (LOAD) para su redirecccionamiento. La rutina de inicio misma debe ser reensamblada para su relocalización. Por esa razón la rutina está en ensamblador: CHADD EQU 23645 Posición de la variable CHADD del SOS ORG XXXXX XXXX= dirección en que se colocará esta rutina LD HL,(CHADD) Comienza salvando real CHADD LD (TEMP), HL Almacenamiento temporal del real CHADD LD HL,49000 posición de la rutina SAVE LD (CHADD),HL CHADD ahora apunta a nuestra rutina CALL 15619 Entra al Save del TRDOS vía chadd JP BACK Salta al programa desde el cual fue llamada esta rutina LD HL,(CHADD) LD (TEMP),HL La rutina para LOAD repite ahora LD HL,49500 todo lo antes expuesto pero cambiando LD (CHADD),HL las direcciones. CALL 15619 BACK LD HL,(TEMP) empieza a restaurar CHADD LD (CHADD),HL Carga otra vez el CHADD original RET Retorna al sitio desde el cual llegasta aquí TEMP Etiqueta de localización de memoria para almacenamiento temporal Toda la rutina incluido SAVE y LOAD, ocupa solamente 47 bytes. Notas: Existen roms modificadas del Spectrum, llamadas roms ISO, que facilitan la sintaxis desde el Basic. Así en vez de Rand Usr... y Rand...: Rem:... se usan: ! = permite ir al modo Trdos, en vez de teclear Randomize Usr 15616. !Rem: = igual al Rand... :Rem: pero más corto y facil de usar. Mensajes de error: Mensajes On-line: Todos los mensajes a continuación aparecen en pantalla solamente si se está en el modo Trdos. 0- O.K. el comando ingresado era valido y se ejecutó correctamente. 1- No disk No se ha insertado el disco, está sin formatear, o la entrada de la unidad sigue abierta. El comando queda en espera de llevar dichas verificaciones para proseguir su ejecución. 2- No file(s) TRDOS no pudo encontrar el archivo requerido, también es posible que el tipo del archivo no fuese el correcto. Ejemplo: LOAD "TEST"CODE en vez de LOAD "TEST" 3- *ERROR* Sucede en caso de error sintáctico. Ejemplos: SAVE "CJ"" - lleva un " extra. 4- Out of memory No hay espacio suficiente al cargar un programa. También se da si no hay 4k para que MOVE pueda operar. En este caso basta resetear la ma´quina para liberar espacio y solucioanr el problema. 5- File exists El archivo que uno está tratando de salvar, ya existe. 6- Overwrite existing file? (Y/N) Cuando se copian archivos de un disco a otro y ya hay otro archivo del mismo nombre y tipo, el sistema pregunta: "Sobrescribo archivo existente? (S/N)". Y continuará sobrescribiendo. N ignorará el archivo. 7- Disk error Trk xx sec yy Retry,Abort,Ingnore? El disco tiene errores en el sector yy del track xx. Solo hay tres opciones: pulsar "R" para reintentar (Retry), "A" para cancelar la ejecución (Abort) o "I" para Ignorar ese sector y continuar con el resto de operaciones. 8- Write protect Trk xx, sec yy Retry,Abort,Ignore? El disco está protegido contra escritura. Nuevamente hay tres opciones. Pero antes de reintentar, habría que cambiar el disco o desprotegerlo. 9- Verify Error Es el caso de VERIFY no exitoso, el archivo en el disco es distinto al que está en memoria. Códigos de Error en modo Basic: Desde el SOS o el CM, no hay mensaje de error alguno, excepto los que son propios del SOS mismo. Los códigos de error se almacenan en el par de registros BC del Z80, quedando así disponibles para el usuario y son: 0 ----- No errors (O.K.) 1 ----- No files (no se halló el archivo) 2 ----- File exists (el archivo existe) 3 ----- No space (sin espacio) 4 ----- Directory full (el directorio está lleno) 5 ----- Record number overflow (se fue más allá del número de registros en el fichero) 6 ----- No disk (disco inexistente) 7 ----- Disk errors (errores en el disco) 8 ----- Syntax errors (error de sintaxis) 10 ----- Stream already opened (canal ya abierto) 11 ----- Not disk file (no hay archivo en disco) 12 ----- Stream not open (el canal no está abierto) Para trabajar con los códigos de error, hay que asignar una variable al comando del Trdos. Esta variable cogera el valor del error luego de ejecutarse el comando. Ejemplo 1: LET A=USR 15619: REM: CAT Ejemplo 2: Un simple programa que nos ilustra sobre el uso del código de error 1: 10 CLEAR 65367 20 LET ERR = USR 15619: REM: LOAD "COPY"CODE 25 REM el codigo de error es capturado en la variable ERR 30 IF ERR = 1 THE CLS: PRINT AT 10, 1;"""COPY""CODE No existe en el DISCO": STOP 40 RANDOMIZE USR 32768 50 RANDOMIZE UST 15616