+3edos y +3dos -------------- He creado este manual tomando material de los capitulos pertinentes del manual original del +3, así como de la informacion existente en la WEB sobre el +3e. Todo el texto está dividido en 4 partes: I - dedicado a los comandos de disco e impresora del +3 II - los comandos extras que ofrece el +3e III - los mensajes de error tanto del +3 como del +3e IV - como apendice, los codigos del manejo de ventanas del +3e Parte I: +3dos. Cuando Amstrad decidió crear el +3, eligió en vez del sistema microdrive de Sinclair, su propia opcion: el + 3dos, el cual se basaba en el sistema de discos empleado por las mismas computadoras CPC de Amstrad: el AMSdos. Por un lado ofrecía todas las facilidades que se esperan de un buen DOS, como son: formateo de discos, catalogo de los directorios, renombrar, copiar y eliminar archivos, pero sin las posibilidades del manejo y creacion de ficheros tanto secuenciales como directos. Si un usuario de +3 quería trabajar con ficheros aunque sea secuenciales, tenía que conseguirse una utilidad como por ejemplo el Hisoft Basic. De lo contrario, debía trabajar con CP/M, ya que este le permitía correr el Mallard Basic, que si tenia todos los comandos requridos para manejo tanto de ficheros secuenciales como aleatorios o directos. Mejor aun, uno podía elegir el Dbase IIm el mejor programa de bases de datos de aquellos días. Sintaxis: comando "[[user]drive:] nombre [.ext]" Los comandos son los siguientes: Format, Cat, List, Load, Save, Merge, Move, Erase, Open#, Close#, Lprint, Llist. user = un numero de 0 a 15 para designar un usuario especifico Los drives admitidos son solamente: - 'a:' y 'b:' para unidades de disco - 't:' para cintas de casete - 'm:' para el disco RAM El nombre es de hasta 8 caracteres sin ningun espacio entre las letras. La extensión consta del punto más tres letras. Los sigtes signos no pueden ser admitidos como nombre o extension de un archivo: /<>-+=!&() No hay distincion entre mayusculas y minusculas al tipear un nombre de archivo. Los atributos de los archivos son tres: - oculto (el archivo no aparece en el directorio, modo estado de sistema) - protegido. - archivo. Se admiten * y ? como wildcards específicados. Format (disk) sintaxis: Format "drive:" solo puede ser usado con 'a' o 'b', si se intenta otra letra dará error. Ejemplo: Format "a:" Format (printer) sintaxis1: Format Line fija los baudios para la interfase serial, donde n = 75...19200. 9600 es el valor por defecto. sintaxis2: Format Lprint f1[;f2] donde: f1 = una letra: "c" (centronics), "r" (rs-232) y "e"(expandido) y "u" (no expandido) f2 = solo "e" ó "u", si f1 = "c" ó "r" permite seleccionar la impresora a usar y si se desean imprimir tokens o no. Cat sintaxis: Cat [#n,] "[{user}d:][nombre{.ext}]" [Exp] EXP - permite ver los atributos de los archivos, así como muestra los que no están visibles. Ejemplos: Cat - muestra el contenido del disco por defecto Cat #3;"2b:" - manda el catalogo del disco B usuario 2 a la impresora Cat "datos" - verifica si existe o no el archivo dado en el disco Cat "m:" Exp - muestra el contenido del disco RAM con información expandida Cat "t:" - cataloga el contenido de la cinta archivo por archivo Admite wildcards. Save Sintaxis: Save "[{user}drive:]nombre[.ext]" Line/Code/Data/Screen$ Cuando el nombre ya existe el +3dos crea automaticamente un backup antes de salvar nuevamente. Load sintaxis: Load "[{user}drive:]nombre[.ext]" Code/Data/Screen$ Nota: Save "drive:" y Load "drive:" permiten elegir la unidad por defecto. De elegirse "t:", solo los comandos Save, Load y Merge pasaran a trabajar con la cinta. Ejemplo: Load "t:": Save "a:" - permite cargar solo de cinta y salvar a disco a la vez No se admite sintacticamente el poder elegir el usuario por defecto mediante SAVE o LOAD. Ejemplo: Load "b:" es valido, pero Load "5b:" no lo es. Merge sintaxis: Merge "[{user}drive:]nombre[.ext]" No admite Merge "t:" como orden para seleccionar cintas en vez de discos. Verify sintaxis: Verify "nombre"Data/Screen$/Code Comando exclusivo de casete. No es admitido para usarse con discos. Move (Rename) Comando para renombrar los archivos. Sintaxis: Move "[{user}d:]nombre1" To "nombre2" Ejemplo: Move "code.B" To "Codigo.B" Admite wildcards. Move (attributes) Permite cambiar los atributos del archivo. sintaxis: Move "nombre" To "signo atributo" donde signo = '+' (activar) o '-' (desactivar) y atributo = una letra: 'P' para proteccion, 'S' para estado de sistema, y 'A' para archivo. ESte ultimo es solo para compatibilidad con el CP/M, e ignorado por el +3Dos. Ejemplo: Move "copia.Pac" To "+P" Admite wildcards. Erase sintaxis: Erase "[{user}drive:]nombre.ext" Ejemplos: Erase "a:prg.P", Erase "Alfa.*" Admite wildcards. Copy sintaxis 1: Copy "[{user}d1:]nom1" TO "[{user}d2:][nom2]" permite copiar un archivo en el mismo disco o en otra unidad o de disco a disco. Ejemplo: Copy "a:fred" TO "m:" - copia archivo 'fred' al disco RAM Admite wildcards. sintaxis 2: Copy "[{user}drv:]nombre" TO disp donde disp = Screen$ / Lprint permite mandar el contenido de un fichero de texto a la pantalla o a la impresora Equivale a la orden Microdrive: MOve "m",drv,"nombre" TO #, donde n = 2 o 3. sintaxis 3: Copy "[{user}drv:]nombre" TO Spectrum Format convierte achivos que fueron hechos para otras maquinas y no son reconocidos por el +3, añadiendoles una cabecera leible por el Spectrum con extensión '.hed' Ejmeplo: COPY "game.com" TO SPECTRUM FORMAT - crea archivo 'game.hed' sintaxis4: Copy Exp [Inverse] manda a la impresora las 24 ineas completas que conforman la pantalla, convirtiendo todo a grises, tomando en cuenta incluso el brillo. La orden Inverse hace el volcado de pantalla en negativo. Open# Sintaxis: Open# canal,"dispositivo" Sin expansion, dispositivo solo puede ser una letra: K,S o P Close# Sintaxis: Close# cierra el canal especificado. Devuelve error si se cierra un canal previamente cerrado. Autorun +3dos ofrece la posibilidad de autoarranque del disco si contiene el archivo de nombre "disk". Para crearlo basta con salvar el programa de autoarranque del disco mediante: SAVE "disk" LINE n Llist Llist hace lo mismo que List pero manda la información a la impresora serial o paralela. Lprint Lprint es igual que Print pero con la impresora en curso. Admite codigos ESCape (chr$ 27). Cuentas de usuario: En maquinas CP/M con discos de mayor capacidad o con discos duros y quizas mas de una terminal conectada, los numeros de usuario son usados para guardar archivos en sub divisiones (llamadas areas de usuario) evitandose asi un directorio con miles de archivos. Pero en el +3, un disco no puede tener más de 64 archivos(-), lo que hace innecesarias las areas de usuario. Aun asi pueden ser usados si uno lo desea. Para eso el nombre del archivo se divide en 4 campos como son: numero de usuario letra de unidad : nombre de archivo . extension Si se elige un numero de usuario, entonces uno debe tambien añadirle la letra de unidad. De este modo para salvar un archivo en el area de usuario 5, debemos tipear: SAVE "5a:cuadros" por ejemplo. El problema es que es muy facil olvidarse en cual area de usuario salvó uno un archivo, y ya que CAT solo cataloga un usuario por vez, encontrarlo podría tomar tiempo, es decir, habria que ver CAT por CAT del 1 al 15 hasta encontrar el archivo en cuestion. (-): el manual original obviamente alude a un +3 normal sin expansion alguna. Parte II: +3e-dos. El +3e posee una version mejorada del +3dos, con todos los fallos corregidos, añadiendole comandos extras al Basic del +3 para manejar discos duros así como la creacion y manipulacion de ficheros y ejecutar archivos .z80 (snapshots). comandos extendidos: Format To, Cat Tab / Asn, New Data / Exp, Move...Bin / For / In / Out, Print #, Inkey$ #, Open #, Close #, Return #, Goto #, Dim #, Next #, Spectrum Format To sintaxis: FORMAT TO un,maxpar[,cils] donde: un = un valor de 0 a 1 designando la unidad maestra (0) o esclava (1) maxpar = una valor de 0 a 65535 indicando el maximo numero de particiones permitidas al disco cils = parametro opcional indicando el numero limite de cilindros a usar del disco es el comando requerido para formatear el disco duro. De incluirse el parámatro no se sobreescribe el primer sector, lo que permite tener una particion Idedos y una de PC. Ejemplos: FORMAT TO 0,15 - formatea y fija a 15 el maximo numero de particiones posibles FORMAT TO 1,31,300 - formatea usando solo los cilindros de 0 a 299 Cat Tab sintaxis: CAT [#m] TAB [EXP] lista la informacion de los discos duros conectados al +3e, tal como: el número de cilindros, cabezas y sectores así como las particiones del disco de haberlas. Exp - da un catalogo expandido y muestra las posiciones de comienzo y final de cada partición. Ejemplo: CAT #3 TAB EXP - envía a la impresora la informacion expandida del disco duro Cat Asn sintaxis2: CAT [#m] ASN lista generalmente en pantalla el mapeado de unidades siendo '0>' el disco maestro y '1>' la unidad esclava. '2>' es el disco "a:", '3>' el disco "b:" y '4>' el disco RAM. New (partition for) Data sintaxis: NEW DATA {un}p$,sz donde: un = la unidad maestra '0>' o esclava '1>' p$ = nombre de la particion a crear con un maximo de hasta 16 caracteres incluido espacios sz = un valor de 1 a 16, el tamaño de la partición en megabytes Ejemplos: NEW DATA "0>Juegos",16 NEW DATA "Mis documentos",16 New (partition) Exp(anded) Sintaxis: NEW EXP p$,sz crea memorias de intercambio, las cuales son usadas por el +3e y sus aplicaciones como memoria virtual extra. Se recomienda hacer dos de estas particiones de 4 mb cada una. Ejemplo: NEW EXP "swap1",4 - crea particion de intercambio llamada swap1 Move...Bin (kill) sintaxis: MOVE {un}p$ BIN elimina la particion p$ destruyendo todo su contenido Ejemplo: MOVE "Utilidades" BIN Move...For (rename) sintaxis: MOVE {un}p$ FOR n$ renombra la particion p$ bajo el nombre n$, el cual no debe nunca empezar por un numero o será añadido como parte de su nombre. Ejemplo: MOVE "1>Utilidades" FOR "Utils" Move...In / Out (assigning) sintaxis1: MOVE d$ IN p$ [ASN] mapea una particion p$ asignandole una letra de unidad d$ para su identificacion sintaxis2: MOVE d$ OUT [ASN] desmapea la unidad especificada p$ dejando libre d$ para futuros usos en este caso p$ puede ser tanto un nombre o un numero de unidad como '0>' ASN - hace que la asignacion/desasignacion de unidades sea permamente Nota: Es posible con estos comandos desmapear y reasignar las unidades "a:","b:" y "m:". Ejemplos: MOVE "C:" IN "Juegos" MOVE "D:" IN "4>" ASN MOVE "C:" OUT LOAD/SAVE/VERIFY/MERGE d$ {ASN} trabajan con el disco duro del mismo modo que se usan con el disco o cintas. Con ASN, cualquiera de estos comandos permite asignar una unidad d$ como permanente. VERIFY y MERGE ahora pueden ser usados para elegir la unidad de disco por defecto como lo hacen SAVE y LOAD. Open # Permite trabajar ahora con canales expandidos para manejo de ficheros, memoria, variables o ventanas de texto. Admite tambien la posibilidad de usar un numero de usuario, siempre que anteceda a una letra de unidad. sintaxis1: OPEN #n, "t>[{user}d:]f" donde: n = un canal de 4 a 15 t = una letra indicando el tipo de manejo de los datos ya sea un fichero, una variable o una ventana de pantalla: I,i > - solo lectura (input). O,o > - Solo escritura (output). U,u > - permite añadir / actualizar (update) nuevos datos (tipo append). d: = una letra indicando la unidad de disco a/b o una particion de disco duro por ejemplo c: f = el nombre más una extension opcional Permite almacenar datos numéricos y cadenas. No devuelve EOF, requiere terminar con una marca de fin de fichero como CHR$ 0. Ejemplo: Open# 4,"I>file1.dat" - abre para solo lectura. Permite el uso de Inkey$# n. Input # no opera correctamente y provoca error Open# 4,"O>a:alfa" - crea el archivo alfa en el drive "a" sino existiera y pasa a modo de escritura. (De existir el fichero, todos los datos se perderían pues lo "resetearía".) Permite el uso de Print# n;(a$/var.) Open# 4,"U>file2.dat" - abre el file2.dat para leer y escribir datos en el. Open# 5,"U>1c:alfa" - abre fichero en disco duro con cuenta de usuario 1 (El archivo debe de haber sido creado previamente con O>, de lo contrario dará error) Para hacer un append hay que conocer la longitud total del fichero con o sin marca de EOF (ver Return # y Goto #). Generalmente los canales 0 - 3 están reservados y deben de usarse con cuidado. sintaxis2: OPEN #n, "t>par" donde par = los parametros requeridos por los nuevos canales dispositivos de OPEN: M, m >dir, ln - usa la RAM del mismo modo que un fichero de lectura/escritura a partir de dir con longitud ln V, v >x$ - permite manejar una variable 'x$' como fichero de lectura/escritura W, w >lin, col, ht, wd[, csiz[, cset]] - permite definir y trabajar con ventanas donde: lin, col = las coordenadas AT de la ventana a crear ht, wd = el largo y ancho de la ventana en caracteres csiz = un valor opcional de 3 a 8 para el tamaño de los caracteres cset = la direccion en memoria donde se almacena un juego de caracteres definido por el usuario. Acepta tanto Print # como Input # (este ultimo actua como Print #). Ejemplo de canal de acceso a variables: 10 DIM a$(1000) 20 OPEN #8, "V>a$" 30 CAT #8 ASN 40 RETURN #8, lo 50 PRINT "Longitud asignada =";lo 60 PRINT "Listado:" 70 PRINT a$( TO lo) 80 CLOSE #8 Ejemplo de canal de acceso a la RAM: 10 CLEAR 29999 20 OPEN #7, "M>30000,1000" 30 CAT #7 40 LET x=USR rutinadelusuario 50 CLOSE #7 Ejemplo de canal de acceso a ventanas: OPEN #5,"w>0,0,24,32,5" Close # sintaxis: CLOSE #n se han corregido los fallos de la ROM original, ahora es es seguro cerrar canales previamente cerrados. Return # sintaxis: RETURN #n, almacena en 'var' la posicion del puntero del canal en curso. Solo puede usarse con los canales expandidos. Ejemplo: RETURN #4,posf Dim # sintaxis: DIM #n, almacena en 'var' la extension o tamaño del canal en curso. Funciona solo con canales expandidos. Ejemplo: DIM #4,tamf Goto # sintaxis: GOTO #n, m mueve el puntero a la posicion m. Puede ser usado en combinacion con Return #. Solo canales expandidos. Ejemplo: GOTO #4, 55 - pocisiona el puntero en 55 para lectura/escritura Next # sintaxis: NEXT #n, almacena en 'var' el codigo ASCII del siguiente caracter almacenado con Print #. Usado con el canal "K", actúa como Inkey$, pero espera siempre a que se pulse una tecla. Ejemplo: NEXT #0, x - lee datos del canal K y lo guarda en x Debido a que Input# devuelve error o genera 'cuelgues' al usarse con ficheros, debe usarse en su lugar: 9000 LET a$="" 9010 NEXT #chn,c 9020 IF c=13 THEN RETURN 9030 LET a$=a$+CHR$ c 9040 GO TO 9010 donde 'chn' es el flujo del canal seleccionado Spectrum sintaxis1: SPECTRUM "[d:]f$" carga y ejecuta un snapshot salvado en formato .SNA o .Z80. Soporta tanto los de 48k como los de 128k. Este comando solo funciona con discos duros o memorias Flash compactas. Para cargar desde un disquete, se requiere de una utilidad que permite hacer eso. Ejemplo: SPECTRUM "c:trapdoor.z80" sintaxis2: SPECTRUM ord {ASN} donde: ord = Ink / Paper / Bright / Flash / Attr c = color de tinta o papel / activador de brillo y parpadeo / atributo de color asn = asignacion permanente Estas ordenes establecen los atributos de pantalla del editor del +3 de forma temporal o permanente. Ejemplos: SPECTRUM INK ti [ASN] - tinta SPECTRUM PAPER fo [ASN] - color del fondo SPECTRUM BRIGHT br [ASN] - brillo SPECTRUM FLASH pa [ASN] - parpeadeo SPECTRUM ATTR n [ASN] - donde: n=(128*pa)+(64*br)+(8*fo)+ti. Ejemplo: SPECTRUM ATTR 4 Parte III: Mensajes de error del +3 y +3e Codigos de error del +3DOS: los errores de disco se dividen en dos clases: recuperable y no recuperables. Errores recuperables de disco: 0 Drive not ready - unidad no preparada 1 Disk is write protected - disco protegido contra escritura 2 Seek fail - falló la busqueda 3 CRC data error - error en los datos del CRC 4 No data - no hay datos 5 Missing address mark - falta la marca de la direcccion 6 Unrecognised disk format - formato de disco no reconocido 7 Unknown disk error - error desconocido de disco 8 Disk changed whilst +3DOS was using it - disco cambiado mientras el +3dos lo usaba 9 Unsuitable media for drive - medio inapropiado para unidad Errores no recuperables: 20 Bad filename - nombre de fichero erroneo 21 Bad parameter - parametro erroneo 22 Drive not found - unidad no encontrada 23 File not found - archivo no encontrado 24 File already exists - archivo ya existe 25 End of file - fin de fichero 26 Disk full - disco lleno 27 Directory full - directorio lleno 28 Read-only file - archivo de solo lectura 29 File number not open (or open with wrong access) - numero de archivo no abierto o con acceso erroneo 30 Access denied (file is in use already) - acceso denegado, el archivo ya está en uso 31 Cannot rename between drives - no puede renombrarse entre unidades 32 Extent missing (which should be there) - falta la extension 33 Uncached (software error) - descubierto (error de software) 34 File too big (trying to read or write past 8 megabytes) - archivo demasiado grande (trató de leer o escribir más de 8 megabytes) 35 Disk not bootable (boot sector is not acceptable to DOS BOOT) - disco no buteable 36 Drive in use (trying to re-map or remove a drive with files open) - unidad en uso (trató de remapear o remover unidad con archivos abiertos) Por ejemplo, el reporte 'Unsuitable media for drive' es causado al tratar de escribir en un disco simple track con una unidad doble track, o al tratar de leer o escribir en un disco de doble track con una unidad simple track. El reporte 'Missing address mark' es un error generado cuando se trata de acceder a un disco que no ha sido formateado (su bien hay otras razones para generar este error). Si se dan un error recuperable, +3DOS da un mensaje al usuario: '- Retry, Ignore or Cancel?' (reintentar, ignorar o cancelar) si el usuario responde con 'R', se reintenta la operacion. 'I', hace que el error sea ignorado, y 'C' hace que la operacion sea cancelada y una condicion de error es retornada. Si se desabilitan los mensajes de error o si el error no es recuperable, ya no se da mensaje alguno. Mensajes de error del +3e +3e puede generar cualquiera de los mensajes de error estandar cuando accede a archivos en el disco duro. Pero también añade los siguientes mensajes de error propios del disco duro: Invalid partition (Partición incorrecta) - La partición especificada no existe o es del tipo incorrecto. Invalid device (Dispositivo incorrecto) - El dispositivo físico especificado no existe. Partition already exists (La partición ya existe) - Se intentó crear una partición con el mismo nombre de una que ya existía. Not implemented (No implementado) - ¡Este error nunca debería ocurrir! Partition open (Partición abierta) - La partición que se está intentando borrar o mapear ya ha sido mapeada a una unidad. Out of partition handles (Sin accesos a particiones) - Insuficiente acceso a particiones para llevar a cabo la operación en curso. Desmapee una unidad e inténtelo de nuevo. Not a swap partition (No es partición de intercambio) - Una aplicación ha intentado utilizar una partición de datos como espacio de intercambio. Drive already mapped (Unidad ya mapeada) - Se está intentando mapear una unidad pero dicho mapeado ya pertenece a otra partición o disco físico. Out of XDPBs (Sin XDPBs) - No hay suficientes XDPB disponibles para efectuar la operación actual. Desmapee una unidad e inténtelo de nuevo. No swap partition available (Partición de intercambio no disponible) - Una aplicación ha intentado usar una partición de intercambio, pero no ha podido encontrarla. Cree una nueva partición de intercambio e inténtelo de nuevo. Codigos de control CHR$ con ventanas A manera de apendice incluyo aquí los codigos que pueden ser usados con Print en ventanas mediante Chr$: 0 - desactiva la justificacion de texto 1 - activa la justificacion 2 - Salva contenido de la ventana actual 3 - Restaura contenido salvado de la ventana 4 - pone el cursor al inicio 5 - pone el cursor al fondo 6 - Tabula a la izq. o centro de la ventana (equivale a "PRINT , ") * 7 - enrolla la ventana 8 - cursor izquierda * 9 - cursor derecha * 10 - cursor abajo 11 - cursor arriba 12 - borra caracter a la izquierda del cursor * 13 - Salta a nueva linea (equivale a "PRINT ' ") 14 - Como CLS manteniendo todos los atributos en curso 15 - fija la ventana con los atributos en curso sin hacer CLS 16, n - tinta n (INK 0-7) ** 17, n - papel n (PAPER 0-7) ** 18, n - activa/desactiva el parpadeo (FLASH 0-1) ** 19, n - brillo (BRIGHT 0-1) ** 20, n - modo invertido (INVERSE 0-1) ** 21, n - OVER n (0-1) ** 22, y, x - posiciona el cursor a 'y' (en pixeles), 'x' (en caracteres) * (+) 23, n - TABula los caracteres a la columna n * (++) 24, n - pone los atributos a n (0-255) ** 25, n - si n=1, los caracteres 165-255 serán impresos como UDGs, con los datos puestos al final de los UDGs. si n=0, los caracters 165-255 serán impresos como palabras BASIC reservadas (opcion por defecto). * 26, n - llena la ventana con el byte n. los Atributos son afectados, no la posicion del cursor. ** 27, n - llena la ventana con el caracter n. los Atributos y la posicion del cursor son afectados. ** 28, n - pone el ancho a doble (n=1) o normal (n=0). * 29, n - fija la altura a n (0=normal, 1=doble, 2=reducido, 3=doble reducido) ** 30, n - fija la justificacion (0=a la izquierda, 1=centrado, 2=total) 31, n - permite usar codigo de encaje en modo justificado si n=1. * Notas: * = el codigo es ignorado en modo justificado pero no su configuracion ** = admitido en modo justificado solo si está activo el modo de encaje CHR$ 31 + = CHR$ 22+CHR$ y+CHR$ x; es igual a tipear AT y,x; ++ = CHR$ 23+CHR$ x; equivale a TAB x; Ejemplo del uso de codigos CHR$ con una ventana: 100 OPEN #5,"w>0,0,24,32,5" 110 PRINT #5; PAPER 4; CHR$ 14; 120 PRINT #5; "Hola" 130 PAUSE 0 140 INPUT #5; PAPER 6; CHR$ 15; 150 PRINT #5; AT 50,5;"amigo" 200 CLOSE #5 Rutina para ver contenidos en areas de usuario, en este caso de un disco duro: 10 For n= 1 To 15 20 Pint "DIR USER ";n 30 Cat Str$(n)+"c:" 40 Pause 0 50 Next n Francisco León. zx_if1@hotmail.com