Capítulo 5. AMSDOS y CP/M

Parte 1: AMSDOS

Contenido:


Introducción

AMSDOS amplía el BASIC suministrado con su ordenador al añadirle algunas órdenes externas, identificadas por el signo | que las precede.

AMSDOS permite cambiar libremente los discos siempre que no haya ningún fichero abierto. Si lo hay, emite un mensaje de error y se puede producir una pérdida de datos si el fichero estaba abierto para escritura (en dirección de salida).

Directorio del disco

Todos los discos tienen dos secciones: el directorio y el área de datos. El directorio contiene la lista de los nombres de los ficheros y un "mapa" de la organización del área de datos. AMSDOS y CP/M pueden calcular el tamaño de un fichero consultando su reseña en el directorio. El cálculo del espacio libre se realiza sumando las longitudes de todos los ficheros y restándolo de la capacidad total del disco.

Cada vez que se va a leer de un fichero, se consulta su reseña en el directorio para averiguar su situación en el disco. Cuando se crea un fichero nuevo, se le reserva espacio en el disco. Cuando se borra un fichero, se libera el espacio por él ocupado. El directo rio trabaja en unidades de 1K y puede contener hasta 64 reseñas. Los ficheros largos necesitan una reseña para cada 16K, si bien este hecho queda oculto y carece de importancia para el usuario.

Cambio de discos

AMSDOS (y CP/M Plus) permite el cambio o la extracción del disco en todo momento en que no se esté accediendo a él, suponiendo que no haya ningún fichero abierto en esa unidad. A diferencia de CP/M 2.2, no necesita "reconocer" los discos.

Si se extrae un disco cuando se está escribiendo en él, se pueden perder los datos grabados en el disco. En cuanto AMSDOS detecta que se ha extraído un disco habiendo ficheros abiertos en él, se abandonan todos los ficheros y se emite un mensaje de error. Los datos pendientes de escribir en el tampón de salida se perderán, y no se grabará la última reseña del directorio. No obstante, AMSDOS solamente detecta la extracción del disco cuando consulta el directorio, lo que ocurre, con ficheros grandes, una vez cada 16K (y siempre que abre o cierra un fichero). Así, es posible perder 16K de datos si se extrae un disco antes de cerrar todos los ficheros abiertos en él.

Nombres y tipos de ficheros en AMSDOS

Es costumbre dar a los ficheros nombres que incluyan un distintivo del tipo de fichero de que se trata. Este convenio no obliga al ordenador a utilizar los ficheros de una forma determinada, si bien hay programas que solamente aceptan ficheros de un tipo de terminado. BASIC acepta ficheros de todo tipo, pero busca preferentemente ciertos tipos si no se le especifica otra cosa. (Véase la sección Cabeceras de fichero en AMSDOS.)

Construcción de los nombres de los ficheros

El nombre del fichero consta de dos partes, separadas por un punto (.). La primera parte consta de 8 caracteres como máximo; la segunda puede contener hasta 3 caracteres. Así, por ejemplo, "ROINTIME.DEM", "DISCKIT3.COM" y "DISC.BAS" son nombres correctos de fichero.

La segunda parte del nombre del fichero es el distintivo de tipo. Los nombres y los distintivos pueden consistir en una mezcla cualquiera de letras y números, pero no pueden contener espacios ni signos de puntuación. Algunos distintivos de tipo convencionales. son los siguientes:

DistintivoDescripción
.<espacios>Tipo no especificado. Puede ser un fichero creado por OPENOUT "<nombrefi>”, o bien un programa de BASIC grabado por AMSDOS con SAVE "<nombrefi>",A.
.BASPrograma de BASIC grabado con SAVE "<nombrefi>", con SAVE "<nombrefi>",P o con SAVE " <nombrefi>".BAS",A.
.BINPrograma o zona de memoria grabados por AMSDOS con SAVE "<nombrefi>",B,<parámetros binarios>.
.BAKEste distintivo se asigna automáticamente a la versión anterior de un fichero cuando AMSDOS o un programa de ayuda graban una versión más moderna con el mismo nombre. Esto permite que el usuario pueda utilizar o consultar la versión anterior siempre que lo necesite.
.COMFichero de orden (programa directamente ejecutable). Los programas de ayuda de CP/M son de este tipo.
.SUBFichero de instrucciones para el programa SUBMIT de CP/M.

Cabeceras de fichero en AMSDOS

AMSDOS asigna automáticamente a los ficheros, distintivos de tipo adecuados cuando los graba, por lo que normalmente no es necesario especificar distintivo. Los ficheros de BASIC ordinarios, los ficheros de BASIC protegidos y los ficheros binarios se graban con un registro de cabecera, de forma que en el proceso de lectura la orden de AMSDOS

LOAD "<nombreti>"

pueda reconocerlos y obrar en consecuencia. Si la orden LOAD no encuentra el registro de cabecera, supone que se trata de un fichero ASCII, es decir, de un fichero de texto.

Independientemente del registro de cabecera, cuando se pide a AMSDOS que cargue un fichero sin especificarle el distintivo de tipo, empieza por buscarlo con el distintivo

.<espacios>

Si no lo encuentra, busca uno del tipo

.BAS

y, finalmente, del tipo

.BIN

Esto permite que el usuario se despreocupe del distintivo de tipo en la mayor parte de los casos.

Un fichero de disco creado por OPENOUT y escrito por BASIC carecerá de registro de cabecera; su contenido estará en ASCII (es decir, texto normal escrito con las órdenes WRITE, PRINT o LIST de BASIC.) La orden OPENIN busca los ficheros en el mismo orden que LOAD si no se especifica distintivo de tipo.

Nombres de fichero con dos unidades de disco

En los sistemas de dos unidades de disco (esto es, en aquellos a los que se ha conectado la unidad externa), puede haber ficheros en las dos unidades. El ordenador no busca los ficheros automáticamente en las dos unidades, por lo que el usuario debe especificar qué unidad se va a utilizar. Se puede utilizar las órdenes |A, |B o DRIVE (descritas más adelante) para seleccionar una de las dos unidades; o bien, sin necesidad de modificar la unidad implícita, se puede especificar A: o B: como prefijo del nombre del fichero (los números de usuario permiten participar el directorio). Así, por ejemplo,

|B
SAVE "PROG.BAS"
|A

y

|A
SAVE "B:PROG.BAS"

graban el programa en la segunda unidad (B).

Análogamente, se puede modificar transitoriamente la asignación implícita de USER ("usuario", margen de 0 a 15) poniendo el número de usuario como prefijo del nombre del fichero. Así, por ejemplo,

LOAD "15:PROG.BAS"

y

SAVE "15:PROG.BAS"

cargan y graban el programa de la sección del disco correspondiente al usuario número 15, cualquiera que sea la asignación implícita de USER. (Véase más abajo la descripción de la orden |USER.)

Finalmente, se pueden modificar transitoriamente las asignaciones implícitas de USER y DRIVE a un tiempo especificando ambos (y en este orden) como prefijo del nombre del fichero. Por ejemplo,

RUN "15B:PROG.BAS"

Símbolos comodín

A veces se necesita realizar con el disco operaciones (catálogo, copia, borrado, etc.) que afecten a varios ficheros. Cuando se especifica un nombre de fichero para una determinada operación, el sistema busca en el directorio un nombre que coincida exactamente con el especificado. Algunas órdenes pueden actuar sobre un conjunto de ficheros independientemente de alguno de los caracteres de su nombre. En vez de especificar los caracteres "indiferentes", en su lugar se pone el signo de interrogación ?. Si todo el bloque (o resto del bloque) del nombre del fichero o del distintivo de tipo es indiferente, el conjunto de signos de interrogación se puede sustituir por un asterisco. Así, por ejemplo, NOM.* es abreviatura de NOM.???, y F.BAS* es abreviatura de F???????.BAS.

La expresión *.* significa "todos los ficheros".

Ejemplos:

DirectorioConcuerdan con
*.BAS
Concuerdan con
NOM?.BAS
Concuerdan con
N*.BA?
BANCO.BASBANCO.BAS
NOM1.BASNOM1.BASNOM1.BASNOM1.BAS
NOM2.BASNOM2.BASNOM2.BASNOM2.BAS
NOM3.BAKNOM3.BAK
NOM3.BASNOM3.BASNOM3.BASNOM3.BAS
NOMINA.BASNOMINA.BASNOMINA.BAS

Ejemplos de utilización de órdenes de AMSDOS dentro de un programa

Para mejor asimilar las órdenes de AMSDOS, le recomendamos que introduzca en el ordenador y estudie los programas siguientes. No ejecute nunca estos programa con un disco maestro de CP/M instalado: los programas escriben datos en disco, y nunca se debe correr el riesgo de escribir sobre los discos maestros originales. Utilice una copia o un disco de trabajo.

Grabación de variables y volcado de pantalla

El siguiente programa dibuja la bandera británica y graba la pantalla completa en disco. Para ejecutarlo es necesario poner en la unidad un disco inicializado.

10 fichero$="volcpant.srn"
20 MODE 1:BORDER 0
30 DIM color(2)
40 FOR i=0 TO 2
50 READ color(i): REM lee colores de lista DATA
60 INK i,color(i)
70 NEXT
80 ON ERROR GOTO 430
90 OPENIN "param.dat" ' comprueba si existe fichero
190 CLOSEIN:ON ERROR GOTO 0
110 IF numerrom=32 AND DERR=146 THEN CLS
120 CURSOR 1:PRINT "Quiere escribir sobre el fichero":PRINT "anterior? Y/N";
130 a$=INKEY$:ON INSTR(" YN",UPPER$(a$) ) GOTO 130,150,140:GOTO 130
140 PRINT a$:PRINT "Fin del programa":END
150 PRINT a$:CURSOR 0
160 OPENOUT "param.dat"
170 WRITE #9,fichero$,1: REM graba nombre de fichero y modo
180 FOR i=0 TO 2
190 WRITE #9,color(i): REM graba colores
200 NEXT i
210 CLOSEOUT
220 CLS
230 gp=1:GRAPHICS PEN gp:w=125
240 x=-65:a=240:y=400;b=-150:GOSUB 400
250 y=0:b=150:GOSUB 400
260 x=575:a=-240:y=400:b=-150: GOSUB 400
270 y=0:b=150:GOSUB 400
280 gp=2:GRAPHICS PEN gp:w=40
290 a=240:x=-40:y=400:b=-150:GOSUB 400
300 x=0:y=0:b=150:GOSUB 400
310 a=-240:x=640:y=0:b=150: GOSUB 400
320 x=600:y=400:b=-150:GOSUB 400
330 ORIGIN 0,0,256,380,0,400:CLG 1
340 ORIGIN 0,0,0,640,150,250:CLG 1
350 ORIGIN 0,0,280,352,0,400:CLG 2
360 ORIGIN 0,0,0,640,168,230:CLG 2
370 SAVE fichero$,b,&c000,&4000
380 DATA 2,26,6
390 END
400 MOVE x,y:DRAWR a,b:DRAWR w,0:DRAWR -a,-b
410 MOVE x+a/2+w/2,y+b/2:FILL gp
420 RETURN
430 numerror=ERR:RESUME NEXT
run

Fíjese en los distintivos de tipo .DAT y .SRN. No tienen más significado intrínseco que recordarnos cuál es su contenido. El fichero PARAM.DAT será un fichero ASCII sin registro de cabecera, mientras que VOLCPANT.SRN es un fichero binario AMSDOS con cabecera.

Observe que el programa trata de leer el fichero PARAM.DAT, para averiguar si existe, antes de escribir en él. Si no existe, BASIC genera un error, el cual es gestionado por el programa para que la ejecución continúe sin interrupción. Si ya existe el fichero, no se genera error y el programa pregunta al usuario si desea escribir encima de él.

En este fichero se graba información sobre el modo de pantalla, los colores y el nombre del fichero que contiene el volcado de pantalla. La línea 170 ilustra cómo se puede utilizar un fichero de datos para escribir en él valores de variables (fichero$) y constantes (1) que luego hayan de ser utilizados por otro programa.

Carga de pantallas

El siguiente ejemplo es un lector de volcados de pantalla que utiliza un fichero de parámetros para controlar su acción. Observe cómo se leen los datos del fichero con INPUT y cómo se utiliza EOF para adaptar la lectura automáticamente al tamaño del fichero. Para que este programa visualice correctamente el volcado de pantalla, es necesario que la grabación se haya hecho en una posición de memoria conocida, pues en caso contrario la imagen quedará desplazada. Esto se garantiza grabando el volcado después de ejecutar una orden MODE y teniendo cuidado de que durante la formación de la imagen no se desplace la pantalla.

10 DIM color(15): REM preparacion para 16 colores
20 OPENIN "param.dat"
30 INPUT #9,nombrefichero$,modopantalla
40 i=0
50 WHILE NOT EOF
60  INPUT #9,color(i)
70  INK i,color(i)
80  i=i+1
90 WEND
100 CLOSEIN
110 MODE modopantalla:BORDER 0
120 LOAD nombrefichero$
run

Resumen de las órdenes externas de AMSDOS

|A

|A

Orden. Especifica que la unidad de disco implícita sea la A. Equivale a |DRIVE con parámetro A. (La unidad incorporada al ordenador es la A.)

|B

|B

Orden. Especifica que la unidad de disco implícita sea la B. Equivale a |DRIVE con parámetro B. (La unidad incorporada al ordenador es la A.)

|CPM

|CPM Orden. Carga un sistema operativo de disco. Los sistemas operativos suministrados con el ordenador son CP/M Plus y CP/M 2.2.

La ejecución de esta orden no se puede completar si en la unidad no hay instalado un disco de sistema con CP/M. En concreto, CP/M Plus se carga con una copia de la cara 1 de los discos maestros suministrados con el ordenador; CP/M 2.2, con una copia de la cara 4.

|DIR

|DIR [,<expresión literal>]

|DIR,"*.BAS"

Orden. Escribe en la pantalla el directorio del disco (al estilo de CP/M) y el espacio libre. Si se omite el parámetro, se supone *.*.

|DISC

|DISC Orden. Equivale a las órdenes |DISC.IN y |DISC.OUT.

| DISC.IN

|DISC.IN Orden. Especifica que las operaciones de lectura se deben hacer con el disco.

|DISC.OUT

|DISC.OUT Especifica que las operaciones de escritura se deben hacer con el disco.

|DRIVE

|DRIVE,<expresión literal>

|DRIVE,"A"

Orden. Establece qué unidad de disco se debe considerar como implícita en lo sucesivo. Esta orden fallará si AMSDOS no consigue leer en la unidad especificada.

|ERA

|ERA,<expresión literal>

|ERA,"*.BAK"

Orden. Borra todos los ficheros que concuerden con la <expresión literal> y no sean de sólo lectura. Admite símbolos comodín.

|REN

|REN,<expresión literal>,<expresión literal>

REN,"FICHNUEV.BAS","FICHANTI.BAS"

Orden. Da un nuevo nombre a un fichero ya existente en el disco. No puede haber otro fichero con el nombre nuevo. No admite símbolos comodín.

Se puede incluir el parámetro USER ("usuario", véase más abajo) en la <expresión literal> para modificar transitoriamente la situación implícita. Por ejemplo,

|REN,"0:NUEVO.BAS","15:ANTIGUO.BAS"

da al fichero "ANTIGUO.BAS" de USER 15 el nuevo nombre "NUEVO.BAS" en |USER 0, cualquiera que sea el parámetro de USER especificado con anterioridad.

|TAPE

|ТАРЕ Orden. Equivale a las órdenes |TAPE.IN y |TAPE.OUT. Solamente actúa si está conectado un magnetófono externo.

|TAPE.IN

|TAPE.IN Orden. Especifica que las operaciones de lectura se deben hacer con la cinta. Solamente actúa si está conectado un magnetófono externo.

|TAPE.OUT

|TAPE.OUT Orden. Especifica que las operaciones de escritura se deben hacer con la cinta. Solamente actúa si está conectado un magnetófono externo.

|USER

USER,<expresión entera>

|USER,3

Orden. Determina con cuál de las 16 secciones del directorio (áreas de usuario, del 0 al 15) deben actuar ciertas órdenes de manejo de disco (CAT, LOAD, DIR, etc.).

Un fichero grabado en un área de usuario puede ser transferido a otra con la orden |REN. Así,

REN,"15:EJEMPLO.BAS","0:EJEMPLO.BAS" 

transfiere el fichero del área 15 al área 0 sin cambiarle el nombre.

Copia de ficheros de disco a disco

Ficheros de AMSDOS con cabecera

Los ficheros de este tipo se pueden copiar desde CP/M mediante PIP y (véase la parte 2 de este capítulo). Los ficheros creados por AMSDOS con registro de cabecera (véase más arriba) pueden ser copiados en bloque (disco a disco), pero en general su contenido no puede ser entendido por los programas de CP/M.

Ficheros ASCII

Los ficheros creados por AMSDOS sin registro de cabecera estarán generalmente en ASCII y son tanto copiables como entendibles por los programas de CP/M. En concreto, los ficheros de programa, de datos y de texto de ASCII son intercambiables entre AMSDOS y CP/M.

Ficheros de "sólo lectura"

Desde CP/M es posible hacer que un fichero sea de sólo lectura y/o invisible a efectos de catálogo del directorio. Estas características sólo se pueden establecer o anular desde CP/M, pero son respetadas por AMSDOS. Para más detalles, véase la parte 2 de este capítulo (programa de ayuda SET).

Copia de ficheros entre disco y cinta

CP/M Plus no está preparado para acceder a ficheros de cinta y copiarlos en disco, ni para copiar ficheros de disco a cinta. Si lo está, en cambio, CP/M 2.2 (cara 4 de los discos maestros). Los programas de ayuda CLOAD y CSAVE de CP/M 2.2 realizan estas funciones según se muestra en las tablas siguientes.

Procedimientos de copia de ficheros

En las tablas siguientes se describen los procedimientos de transferencia para todo tipo de ficheros entre disco y cinta. No se requiere tener conectada la segunda unidad de disco. Los programas de BASIC protegidos no pueden ser copiados de cinta a disco, ni viceversa; tampoco pueden serlo los ficheros binarios (tales como programas de juegos en código de máquina) si no se conocen las direcciones de carga. En la parte 2 de ese capítulo se da más información sobre los programas PIP, CLOAD y CSAVE.

COPIAR HACIACOPIAR DESDE
BASIC de Amstrad en cinta *
COPIAR DESDE
Datos ASCII en cinta *
COPIAR DESDE
Binario en cinta *
BASIC de Amstrad
en cinta *
|TAPE
LOAD"FICH"
<cambiar cinta>
SAVE"FICH"
|DISC
Binario
en cinta *
H=HIMEM
|TAPE
MEMORY <p>-1
LOAD"FICH"
<cambiar cinta>
SAVE"FICH",B,<p>,<l>[,<e>]
|DISC
MEMORY=H
<nota 2>
ASCII
en cinta *
|TAPE
LOAD"FICH"
<cambiar cinta>
SAVE"FICH",A
|DISC
<insertar disco de CP/M 2.2>
|CPM
CLOAD"FICH",TEMP
<cambiar cinta>
CSAVE TEMP,"FICH"
ERA TEMP
AMSDOS
<nota 1>
BASIC de Amstrad
en disco *
|TAPE
LOAD"FICH"
|DISC
SAVE"FICH"
ASCII
en disco
|TAPE
LOAD"FICH"
|DISC
SAVE"FICH",A
<insertar disco de CP/M 2.2>
CPM
CLOAD"FICH"
AMSDOS
Binario
en disco
H=HIMEM
|TAPE
MEMORY <p>-1
LOAD"FICH"
|DISC
SAVE"FICH",B,<p>,<l>[,<e>]
MEMORY H
<nota 2>
  • * Fichero con cabecera.
  • <nota 1> Requiere espacio libre en el disco para el fichero transitorio "TEMP".
  • <nota 2> <p> es la dirección inicial del fichero, <l> es su longitud, <e> es la dirección opcional de ejecución.
COPIAR HACIACOPIAR DESDE
BASIC de Amstrad
en disco *
COPIAR DESDE
Datos ASCII
en disco
COPIAR DESDE
Binario Amsdos
en disco *
COPIAR DESDE
Todos los demás
en disco
BASIC de Amstrad
en cinta *
LOAD"FICH"
|TAPE
SAVE"FICH"
|DISC
Binario
en cinta *
H=HIMEM
MEMORY <p>-1
LOAD"FICH"
|TAPE
SAVE"FICH",B,<p>,<l>[,<e>]
|DISC
MEMORY H
<nota 2>
ASCII
en cinta *
LOAD"FICH"
|TAPE
SAVE"FICH",A
|DISC
o bien
<insertar disco de CP/M 2.2>
|CPM
CSAVE FICH
AMSDOS
<insertar disco de CP/M 2.2>
|CPM
CSAVE FICH
AMSDOS
<insertar disco de CP/M 2.2>
|CPM
CSAVE FICH
AMSDOS
<nota 3>
BASIC de Amstrad
en disco *
LOAD"FICH"
<cambiar disco>
SAVE"FICH"
o bien
<insertar disco de CP/M 2.2>
|CPM
PIP B:=FICH
AMSDOS
ASCII
en disco
LAD"FICH"
<cambiar disco>
SAVE"FICH",A
<insertar disco CP/M Plus>
|CPM
PIP B:=FICH
AMSDOS
Binario Amsdos
en disco *
<insertar disco de CP/M Plus>
|CPM
PIP B:=FICH
AMSDOS
Todos los demás
en disco
<insertar disco de CP/M Plus>
|CPM
PIP B:=FICH
AMSDOS
  • * Fichero con cabecera.
  • <nota 2> <p> es la dirección inicial del fichero, <l> es su longitud, <e> es la dirección opcional de ejecución.
  • <nota 3> El fichero destino no es utilizable directamente por BASIC. No obstante, esta opción es interesante como medio de almacenamiento a bajo costo. El fichero se puede volver a copiar en disco con CLOAD"FICH" (desde CP/M 2.2).

Guía de referencia de los mensajes de error

Cuando AMSDOS no puede ejecutar una orden, emite un mensaje de error. Si el problema es mecánico o radica en los circuitos, el mensaje de error va seguido de la pregunta:

Retry, Ignore or Cancel?
  • R (reintentar) hace que se repita la operación, posiblemente después de que el usuario haya remediado el problema.
  • I (ignorar) hace que el ordenador continúe como si nada hubiera ocurrido, lo que generalmente da lugar a efectos inesperados y posiblemente indeseados.
  • C (cancelar) hace que se cancele la operación, lo que frecuentemente conduce a un nuevo mensaje de error.

Lista de errores

Unknown command

La orden no ha sido tecleada correctamente.

Bad command

La orden no puede ser ejecutada por alguna razón; error de sintaxis o configuración inadecuada del sistema.

<nombre de fichero> already exists

El usuario ha intentado dar a un fichero el nombre de un fichero ya existente.

<nombre de fichero> not found

No existe ese fichero.

Drive <unidad>: directory full

No queda espacio en el directorio para una nueva reseña.

Drive <unidad>: disc full

No queda espacio en el disco para grabar nuevos datos.

Drive <unidad>: disc changed, closing <nombre de fichero>

Se ha cambiado el disco antes de cerrar el fichero; el ordenador lo cierra.

<nombre de fichero> is read only

El fichero no se puede modificar porque es de "sólo lectura". Los ficheros solamente se pueden caracterizar como de sólo lectura o de lectura/escritura desde CP/M.

Drive <unidad>: disc missing

No hay disco en la unidad, o el disco no está girando correctamente. La acción aconsejable es extraer el disco, insertarlo de nuevo y pulsar R.

Drive <unidad>: disc is write protected

Se ha intentado escribir en un disco que tiene abierto el orificio de protección. Si efectivamente quiere utilizar ese disco, extráigalo, cierre el orificio de protección, insértelo de nuevo y pulse R.

Drive <unidad>: read fail

Error en los circuitos de lectura. La acción aconsejable es extraer el disco, insertarlo de nuevo y pulsar R.

Drive <unidad>; write fail

Error en los circuitos de escritura. La acción aconsejable es extraer el disco, insertarlo de nuevo y pulsar R.

Failed to load CP/M

Error de lectura al intentar cargar CP/M con la orden |CPM, o bien no se ha insertado un disco de sistema de CP/M válido. Cuando se intenta cargar CP/M con un disco que tenga formato "de datos" se genera el mensaje de error "Read fail".