Commodore DOS

El Commodore DOS o CBM DOS es el sistema operativo de disco utilizado en las unidades de de disco de Commodore para sus ordenadores de 8 bits. A diferencia de la mayoría de sistemas operativos de disco que se leen de disco y se ejecutan desde la RAM del ordenador, el DOS de Commodore se encuentra en la ROM de la unidad de disco y es ejecuta desde ella por el procesador integrado en la misma.

Aparecieron ocho versiones de Commodore DOS:

VersiónUnidades de discoAño
1.0Commodore 2040 y 30401979
2.0Commodore 4040 y 30401981
2.5Commodore 80501982
2.6Commodore 1540, 1541, SX-64, 1551, 2031 LP y 40311982
2.7Commodore 8050, 8250 LP y SFD10011985
3.0Commodore 1570, 1571, 8280 (disco de 8 “), D9060 y en las unidades de disco duro 9090.1985
3.1Commodore 1571 integrada en el C128D-CR1986
10.0Commodore 1581 (3.5″)1986

La versión oficial del CBM DOS en todas las versiones de 1541 es la v 2.6, aunque en las versiones posteriores de 1541 la versión del DOS sigue siendo la 2.6, es una versión mejorada en la que se arreglan errores importantes.

Aunque no estaba soportado por Commodore, se pueden grabar las ROM de la 1541-II en EPROM’s y utilizarlas en las primeras 1541 para corregir los errores.

La versión 2.6 del CBM DOS es la más utilizada y conocida, al ser la 1541 la unidad de discos de Commodore más vendida.

Todas las acciones de manejo de discos, como formatear un disco, renombrar, eliminar o copiar ficheros son realizadas por el CBM DOS y se ejecutan íntegramente con el procesador y la memoria de la unidad de disco.

CBM DOS proporciona un sistema de ficheros plano (sin subdirectorios). El número de ficheros en el sistema de archivos está limitado, aunque su número depende de la capacidad del medio, que puede variar de los 170KB de un diskettte a los 4.5MB de un disco duro.

En el caso más habitual, un disco de 5 1/4″ de simple cara, en una unidad de discos 1541 con el CBM DOS v 2.6, puede contener un máximo de 144 ficheros.

CBM DOS define los siguientes tipos de ficheros:

  • PRG: ficheros de programa que pueden ser cargados y guardados (LOAD y SAVE) directamente. El tamaño máximo de fichero que puede cargarse viene dado por la memoria disponible. Así en el C64 el tamaño máximo es de 202 bloques.
  • SEQ: fichero secuencial. Solo puede utilizarse por aplicaciones, El tamaño máximo de fichero es de 168.656 bytes.
  • USR: archivo de usuario. Funcionan igual que los secuenciales salvo que están marcados por alguna aplicación. Indica que ese fichero solo puede ser leído correctamente por una aplicación especial.
  • REL: ficheros relativos. Estos ficheros son de acceso aleatorio, y solo son accesibles por aplicaciones.
  • DEL: ficheros borrados. Pueden verse con aplicaciones de manipulación del directorio.
  • Si el carácter < se muestra después del formato del fichero, entonces el fichero no puede ser sobre-escrito. Está protegido por software.
  • Si el carácter * se muestra antes del formato del fichero, entonces es que ese fichero no fue cerrado adecuadamente. Estos ficheros “zombies” se eliminan con el comando DOS VALIDATE!

Para obtener el directorio de un disco desde BASIC se puede utilizar:

LOAD "$",8
LIST

En el caso de una unidad dual, hay que indicar cual de las dos (0 o 1): LOAD "$0",8 ó LOAD "$1",8

La primera línea tiene muestra un número 0 o 1 que indica el número de la unidad. A continuación aparece en video inverso el nombre, el identificador ID del disco y un código abreviado de la versión de DOS con la que fue creado.

Los códigos de la versión de DOS varían solo en la medida en que las versiones de DOS utilizan formatos de disco incompatibles:

  • «2A» es utilizado por la mayoría de las versiones de DOS de 5,25 pulgadas
  • «3D» es utilizado por el DOS 10.0 en la 1581 de 3,5 pulgadas.

En las líneas posteriores, en una línea por fichero, se indica primero el tamaño del archivo en bloques, luego el nombre del archivo entre comillas y finalmente el tipo de programa. En la última línea aparece el número de bloques libres en el disco.

NOTA: En el Commodore 64, utilizar LOAD "$",8,1 llenará la pantalla con caracteres basura en lugar de cargar el directorio en la RAM del BASIC. Esto es debido a que las direcciones de carga del directorio en la RAM definidas en el DOS se corresponden con el inicio de la memoria BASIC del Commodore PET y VIC-20, pero en C64 se corresponde con la memoria de pantalla.

También hay que tener en cuenta que ver el directorio con el comando LOAD "$",8 sobrescribe el programa BASIC en la memoria. Con LOAD "*",8,1 se carga el primer programa del disco.

Aunque la decodificación y lectura de los datos del disco en la RAM interna de la unidad 1541 es bastante rápida, la transferencia a través del bus serie es bastante baja, de solo 300 bytes por segundo. Puede ser más rápida si se utilizan “fast loader” consiguiendo velocidades de hasta 10 KBps.

DISK DRIVE COMMANDS

La unidad de discos 1541 se controla mediante una serie de comandos de drive, que se usan con los siguientes comandos BASIC en el VIC-20 y en el C64: CLOSE, GET#, INPUT#, LOAD, OPEN, PRINT#, SAVE y VERIFY. También hay una variable de estado ST. En otros modelos de Commodore, puede haber comandos y variables de estado disponibles.

La variable ST o STATUS es una variable del sistema utilizada en el Commodore BASIC V2 usada para comprobar el estado del sistema después de realizar operaciones de entrada o salida de datos en algún periférico, incluyendo la unidad de discos. Esta variable refleja el código de estado generado por el KERNAL, el cual se almacena en la dirección de memoria $0090 (144). El valor de la variable ST está comprendida entre -128 y +127, o entre 0 y 255 si se hace el AND lógico con el valor 255.

Cada dispositivo y operación puede establecer unos bits específicos en la variable ST para indicar el estado de la operación. De esta forma, tras realizar una operación en un disco, se puede comprobar el valor de la variable ST para determinar si la operación ha sido exitosa o ha habido un error.

Nota: el dígito 0 después de la letra de comando no es estrictamente necesario, pero es recomendable su uso para evitar generar un error existente desde las primeras versiones de las unidades 1541.

El nombre del disco puede tener un máximo de 16 caracteres, y el ID necesita 2 caracteres. Los comandos soportan los caracteres comodín:

  • * : corresponde a todos los caracteres restantes.
  • ? : corresponde a un caracter.

Antes de poder enviar cualquier fichero o comando al disco, primero se debe de abrir el canal apropiado:

OPEN 15,8,15

El comando OPEN necesita tres parámetros:

  1. File number: o número de fichero sirve para identificar el fichero en los siguientes comandos. También se le denomina dirección lógica (Logical Address), sobre todo en ensamblador.
  2. Device number: número de dispositivo que indica el dispositivo específico entre los varios conectados al ordenador. Por defecto, el primer disco es el dispositivo 8, el segundo es el 9. En ensamblador se le denomina dirección física (Physical Address).
  3. Secondary address: indica el canal de comunicación. Si el valor está en el rango 0 a 14, se le envía al dispositivo cuando se leen o se escriben datos. Si se usa el valor 15, este indica que es el canal de comandos o “command channel”, lo que indica que se envían comandos del DOS.

Por ejemplo, para borrar todos los ficheros de un disco (“scratched“) se puede usar.

OPEN 1,8,15,"S0:*":CLOSE 1 

Mediante la coma (,) se puede proporcionar más de un archivo o comodín y varios archivos coincidentes podrían ser objeto de la eliminación.

Una vez que se abre un canal se pueden utilizar los siguientes comandos:

NEWFormatea un discoOPEN 1,8,15,"N0:Diskname,ID": CLOSE 1
RESETReiniciar el drive. El canal de error informa la versión DOS de la unidad después del reinicio.OPEN 1,8,15,"UI0": CLOSE 1
INITIALIZEInicializa el drive: relee el BAM (Block Availability Map: mapa de los bloques disponibles) y reinicia los estados de error.OPEN 1,8,15,"I0": CLOSE 1
VALIDATEValida un disco. Comprueba y arregla las estructuras de meta-datos del disco (directorio, bloques libres, ...)OPEN 1,8,15,"V0": CLOSE 1
COPYCopia ficheros.OPEN 1,8,15,"C0:NewFile=OldFile": CLOSE 1
COPYCopia un disco. Copia el disco completo en una unidad de discos dual de la unidad 1 a la unidad 0.OPEN 1,8,15,"C0=C1": CLOSE 1
COMBINEConcatenar ficheros. La cadena de comandos está limitada a 40 caracteres de longitud.OPEN 1,8,15,"C0:NewFile=OldFile1,OldFile2,...": CLOSE 1
RENAMERenombra un fichero. El tamaño de la cadena del comando está limitado a 40 caracteres de longitud.OPEN 1,8,15,"R0:New_Name=Old_Name": CLOSE 1
SCRATCHBorra un fichero.OPEN 1,8,15,"S0:filename": CLOSE 1
REPLACESobre-escribe un fichero.SAVE "@0:filename",8
POSITIONEl comando POSITION requiere el uso de un archivo relativo abierto y debe utilizarse antes de comenzar una operación de lectura o escritura. La cadena de comandos va seguida de tres o cuatro caracteres. El primero es el número de canal, que coincide con el número de canal secundario que se encuentra en el comando OPEN. Los dos caracteres siguientes indican la posición del registro, siendo el dígito menos significativo el primero. El cuarto carácter opcional es la posición dentro del registro dado.PRINT #file#, "P" CHR$(channel#) CHR$(rec#lo) CHR$(rec#hi) CHR$(position)
MEMORY WRITEEscribe en la memoria interna de la unidad de disco.OPEN 15,8,15: PRINT #15,"M-W"; CHR$(LowAddress); CHR$(HighAddress); CHR$(Size): PRINT#15,String: CLOSE 15

El comando REPLACE tiene un error que puede, en determinadas circunstancias, dañar los datos del disco. Esto puede ocurrir con bastante facilidad en un 1541 original, pero incluso en modelos posteriores (1541-II y siguientes), que supuestamente han sido “arregladas” por Commodore, sigue pudiendo ocurrir el error. Es mejor utilizar SCRATCH en lugar de SAVE para evitarlo.

Todos los comandos pueden ejecutarse de dos formas:

  • Directamente:
    • OPEN 1,8,15, "comando": CLOSE 1
  • Utilizando el comando PRINT:
    • OPEN 1,8,15: PRINT#1, "comando": CLOSE 1


Publicado

en

, , ,

por