K-Dos y SP-Dos El K-Dos y el SP-Dos son los nombres de dos sistemas operativos para dos interfaces de disco creados por empresas distintas, para el ZX Spectrum, pero compartiendo comandos y sintaxis en comun. Debido a eso he decidido juntarlos, dando primero una muy resumida referencia sobre el SP-Dos y a continuación el manual completo del K-dos. Watford SP-DOS. Creada por Watford Electronics, esta interface permite conectar al Spectrum lectoras de diskete originalmente pensadas para BBC. Venía completa con su S.O. y un paquete integrado por: Masterfile, Omnicalc 2 y Tasword 2 - una base de datos, hoja electrónica de cálculos y procesador de textos. El SP-DOS cubre muchas de las necesidades del usuario incluyendo facilidades de fusionar programas Basic con MERGE, así como ficheros secuenciales para deleite del programador, a todo lo cual se une el paquete gratuito antes mencionado de Masterfile, Omnicalc 2 y Tasword 2 que hacen del Spectrum un pequeño sistema profesional. Todos los comandos del SP-DOS pueden ser accedidos vía el Basic usando como prefijo: PRINT #4. Un disco en blanco debe ser formateado antes de poderse usar. Para ello, debe usarse la siguiente orden: PRINT #4: FORMAT "FILE-NAME": PRINT n1, n2, n3, n4: donde n1 es la unidad de disco, n2 el número de tracks, n3 el número de caras, y n4 el stepping rate. Además del SP-DOS, la interface también ofrece un segundo sub-sistema llamado "Mini-DOS". Cuando se carga uno de los paquetes como por ejemplo el "Tasword 2", Sp-Dos cambia automáticamente a Mini-Dos el cual ocupa sólo 3k de la RAM del usuario. Si deseas que tu programa se auto ejecute al cargar entonces sálvalo con la orden: PRINT #4: SAVE "filename" LINE n. Nota: A falta de mayor información (como sería el manual del SP-dos), todos los comandos del K-Dos pueden ser considerados válidos también para el SP-Dos y ya que el manual original del K-dos no lo menciona, posiblemente el llamado "Mini-dos" sea una particularidad extra única del SP-dos. Al no poseer ambas interfaces para probarlas y así poder compararlas actualmente, no hay modo de decir si el Sp-dos carece de, o añade comandos o parámetros a los ya existentes en el K-dos. Kempston DOS Sistema operativo de discos de la interface Kempston (K-Dos) v2.0. Abbeydale Designers Ltd 1985. Permite la conexión hasta de 4 unidades de disco ya sean de 5.25", 3.5" o 3" siempre que puedan operar en alta densidad. Todos los discos deben ser formateados antes de poderlos usar. Sintaxis: PRINT#4: comando ["nombre"][: PRINT /] Comandos con PRINT#4: Format, Cat, Load, Save, Merge, Move, Erase, Open#, Close#, New, Goto, Clear, Copy. Comandos sin PRINT#4: Print#, Input#, Inkey$#, Llist, Lprint. Los drives admitidos son numerados del 1 al 4. El número de drive puede ser un número, una variable numérica o alfanumérica con Val. El nombre es de hasta 10 caracteres. Admite wildcards (comodines: solo "^") y extensiones pero no atributos. Las extensiones usan "/" en vez de "." y son para mayor claridad como por ejemplo: "/BAK" para backups, "/BAS" para programas Basic, "/OBJ" para archivos objeto, etc. Debido a la tan peculiar sintaxis del K-DOS, para ingresar más comandos dentro de una línea múltiple como es un PRINT ajeno a la sintaxis del K-DOS debe añadirse "::". Ejemplo: PRINT#4: comando :: PRINT "cadena" - ejecutará el comando del DOS y luego imprimirá la cadena u otro dato de PRINT sin confundirlo con un parámetro del comando K-DOS. Comandos: Format sintaxis: Print #4: Format "nombre": Print nd,nt,ns,sr donde: nombre = un texto válido de hasta 10 caracteres nd = un valor del 1 al 4 designando la unidad a elegir nt = el número de tracks (35, 40, 80) nd = el número de caras (1 / 2) sr = el "stepping rate" (1 - 4: correspondientes a 6, 12, 20 y 30ms) Este comando formatea y da nombre de volumen a los discos en blanco. Ejemplo: Print #4: Format "Disco": Print 1,40,2,1 En caso de 80 tracks, CAT mostrará que el disco tiene capacidad de 800k, 795 disponibles para usuario, pues 5k son reservados para el directorio. Cat sintaxis: Print #4: Cat[: Print d[,"nombre"]] donde: d = un valor de 1 a 4 Print #4: Cat - muestra en la pantalla el tipo de archivo (Basic, bytes, $data, ndata, sequ), el tamaño del archivo en multiplos de 1k y los nombres de los archivos de la unidad por defecto. Print #4: Cat: Print 2,"cadena" - esto seleccionará todos los archivos cuyos nombres contengan la "cadena" buscada. En este caso es forsozo indicar el drive. Se puede enviar el catalogo a una impresora si esta estuviese conectada e inicializa apropiadamente con: Open #2,"p": Print #4: Cat: Close #2 Save Sintaxis: Print #4: Save "nombre" [Line/Code/Data/Screen$][: Print d] Salva el programa dándole un "nombre" en el Microdrive . Nota1: no es`posible salvar un archivo ya existente con el mismo nombre. Para ello hay que borrarlo primero con ERASE y entonces usar SAVE. Nota1: si se hace BREAK mientras se está salvando un archivo este no se cerrará y por lo tanto ya no podrá ser cargado con LOAD. Nota2: SAVE no necesita el borrado previo de un archivo ya existente con ERASE, lo sobreescribe automáticamente al ejecutarse. Nota3: para crear archivos autobooteables, basta con salvarlo bajo el nombre "AUTO" y un número de línea de autoejecución, entonces arrancará al resetear o encender el sistema. Un archivo autobooteable no necesariamente tiene que ser Basic también puede ser un programa en código máquina salvado como "AUTO". Load sintaxis: Print #4: Load "nombre" [Code/Data/Screen$][: Print d] Carga el programa "nombre" del disco o el designado por defecto. Merge sintaxis: Print #4: Merge "nombre"[: Print d] Igual que el comando de casete, carga solo programas basic del disco con el "nombre" dado. Optimo para ahorro de memoria con programas largos. Erase sintaxis: Print #4: Erase "nombre"[: Print d] Borra el programa "nombre" del directorio de la unidad especificada o por defecto. ERASE puede eliminar archivos usando un comodín "^". Ejemplo: Print #4: Erase "program^": Print 1 - borrará todo archivo en el disco 1 cuyos 7 primeros caracteres sean "program" más cualquier otro caracter que le siga como por ejemplo: programa, program1, program$, etc. Nota: Intentar borrar datos en un disco protegido fisicamente contra escritura dará el mensaje de error "Write protect". Move sintaxis: Print #4: Move "fuente","destino"[: Print d1[,d2]] donde: d1 y d2 = las unidades de disco fuente = el fichero a copiar o volumen de disco a cambiar destino = la copia resultante o el neuvo volumend el disco Permite copiar o renombrar archivos de un mismo disco o pasarlos a más de una unidad, así como renombrar también el disco. Admite comodines. Ejemplos: Print #4: Move "alfa","beta" - renombrará el disco o archivo existente en el disco Print #4: Move "file","ficha": Print 1 - igual pero designando el disco 1 Print #4: Move "algol","algol2": Print 1,2 - copia archivo del disco 1 al 2 Print #4: Move "algol","algol2": Print 1,1 - igual pero en el mismo disco Print #4: Move "fuente","": Print 2,1 - copia archivo sin renombrarlo del disco 2 a 1 Print #4: Move "","": Print 1,4 - hace backup total del disco 1 al 4 Print #4: Move "","/cad": Print 1,2 - copiará todo archivo que tenga "/cad" como extensión Cuando se usa un mismo disco para hacer copias de datos entonces el K-DOS notifica al usuario para que cambie los discos para continuar con la operación. Clear sintaxis: Print #4: Clear[: Print m1,m2] Clear borra bloques de líneas desde m1 hasta m2 donde: 0, "nombre"[: Print d] donde: n = un valor del 0 al 15 pero distinto de 4 Comando que maneja ficheros secuenciales abriendo el flujo asociándolo a un buffer necesario para un fichero "nombre" en el drive asignado. Si existe el fichero "nombre" lo abre para lectura. Si no hay tal fichero lo abre para escritura. Un fichero existente puede ser abierto para leer usando más de un buffer a través de flujos distintos hasta donde la memoria lo permita pero intentar hacer eso con un fichero recién creado y aun abierto generará el mensaje de error diciendo qeu el fichero ya fue abierto para escritura. Cada buffer ocupa 570 bytes así que abrir los 15 buffers a la vez tomará 8k de espacio en RAM. Nota: es posible usar también los canales del 0 al 3 para usarlos con ficheros secuenciales, siendo reasignados al cerrarse con CLOSE#. Ejemplo: Print #4: Open# 3, "ficha" - hará que LPRINT, LLIST, PRINT #3 y LIST #3 manden todo a un fichero secuencial antes que a la impresora designada. El final del fichero es posible capturarlo como un error usando el comando GOTO. Print# sintaxis: Print # ;datos Envía la secuencia de datos a un fichero secuencial por un buffer mediante un flujo especificado. El canal debe haber sido abierto previamente para salida o escritura. Print# admite tres tipos de separadores de datos: ; - no imprime nada, dos variable de cadena pueden ser guardadas como un solo texto , - guarda las cadenas pero separándolas por un montón de signos "nulos" ' - genera una nueva línea (CHR$ 13). Mucho más recomendable para separar cadenas. Input# sintaxis: Input #;var;... [LINE] var$;... Lee los datos de un flujo especificado y los pasa a una variable ya sea numérica o de cadena. El canal debe ser abierto previamente. Para devolver el puntero al comienzo del fichero debe cerrarse con CLOSE y abrirse nuevamente. Ejemplo: INPUT #5; LINE v$ - leerá las cadenas contenidas en un fichero secuencial Inkey$# sintaxis: [Let =] Inkey$ # Lee el siguiente caracter de un fichero secuencial desde el flujo dado. Esta función leerá todos los caracteres del fichero, uno a uno, pero dará error "End of File" si se lee más allá del límite del fichero. Close# Sintaxis: Print #4: Close# Libera cualquier canal del flujo especificado cerrándolo. Si hubiese algún dato en el buffer, es entonces transmitido o registrado en el disco. Mensajes de error reportados: A continuación reportes ya existentes en el SPECTRUM pero ahora con respecto a funciones de disco: 4 Out of memory (sin memoria) Ocurrirá con LOAD, MOVE o MERGE si la RAMTOP es demasiado baja como para que quepa el programa cargado en la memoria disponible. Basta CLEAR n para solucionarlo. En el caso de MOVE si el fichero secuencial es demasiado grande deberá ser pasado al nuevo fichero registro por registro. 6 Number too big (núemro demasiado grande) Ocurrirá en caso de números ingresados en los parámetros, si el error persiste rebootear el sistema. Probablemente se de tras un error de drive inoperable. 8 End of file (fin de fichero) Se ha intentado leer más allá del límite del fichero secuencial. B Integer out of range (entero fuera de rango) Ver error 6. C Nonsense in Basic (sin significado en Basic) Ver error 6. F Invalid file name (nombre de archivo no válido) Ocurrirá en caso se escriba un nombre mayor de 10 caracteres con SAVE. El signo "^" dará error como nombre de archivo en cualquier comando excepto ERASE. H Stop in Input Habían caracteres no imprimibles en el fichero secuencial. En vez de INPUT#, usar INKEY$# para leer esta clase de ficheros. J Invalid I/O device (dispositivo de e/s no válido) Ocurrirá si intentas escribir en un fichero abierto para lectura y viceversa. Si el error se da mientras se escribe o se lee un canal en particular, entonces se dio al abrir con OPEN#, por lo que debe ser cerrado antes de proceder. O Invalid stream (Flujo de canal no válido) El flujo no fue abierto. Si el error se da con "#4" entonces rebootear el sistema o usar RANDOMIZE USR 58500 (eso dice el manual). Q Parameter error (parámetro erroneo) Ver error 6. A continuación los errores generados por los comandos propios del K-DOS: S Drive inoperable Se ha especificado una unidad de disco no usada por el sistema, la tapa está abierta, disco mal insertado o la lectora de discos falla. T Disc data lost (datos del disco perdidos) Error del DOS. Pruebe a repetir el comando tras hacer CAT. Si eso falla, el disco puede estar defectuoso. U CRC error Ver error T. V Record not found (registro no encontrado) Normalmente se da cuando el nombre de archivo o fichero no corresponde con ninguno existente en el disco. Verificar con CAT. Verificar si contiene Tokens o signos especiales. Si el error persiste, entonces puede ser problema del disco. W Write protected Se ha intentado escribir en un disco que está fisicamente protegido contra escritura. También se dará si se intenta abrir un fichero en un disco con dicha protección. el canal debe ser cerrado para remover la condición del error. X Disc faulty (disco defectuoso) El sistema ha fallado al tratar de leer o escribir en el disco tras 50 intentos. Y Illegal command Se ha tratado de usar comandos no aceptados por el sistema ni salvados como archivos ejecutables. Z Copyright message a Wrong filetype (tipo de archivo erroneo) Ocurrirá al tratar de cargar un archivo con la especificación erronea, como usar OPEN# con un archivo que no es fichero secuencial. b Undefined error Se ha usado un comando o rutina no definidos en el DOS. c Directory full 144 entradas han sido usadas en el disco. Debe de haber menos de 144 archivos ya que las entradas extras son usadas por ficheros secuenciales de más de 48k y para todos los archivos si el disco está lleno. Esto puede ser resuelto haciendo una copia completa del disco para asegurar el uso eficiente de las entradas del directorio. d Disc full (disco lleno) Se ha usado todo el espacio disponible en el disco. cualquier archivo a salvar deberá serlo en otro disco. En el caso de CLOSE#, no operará normalmente y algunos datos se perderán. e Filename in use (nombre de archivo ya usado) Cuando el comando MOVE advierte esto, debe usarse ERASE para eliminar el archivo primero. f Protected file Se ha intentado mover un archivo protegido. g Stream already open (flujo de canal ya abierto) El flujo de un fichero DOS ha sido ya abierto con OPENM# y deberá ser cerrado con CLOSE# antes intentar abrirlo de nuevo. h File open for writing (archivo abierto para escritura) Solo es posible abrir un fichero por varios canales si este es abierto solo para lectura. Solo se abre para escritura al crearse, así que intentar abrirlo por otro canal estando ya abierto dará este error. i Verification failed Si la verificación falla, trata de reformatear el disco. Si esto se repite, cambiar el disco pues debe estar defectuoso.