stringtranslate.com

Commodore DOS

Commodore DOS , también conocido como CBM DOS , es el sistema operativo de disco utilizado con los ordenadores de 8 bits de Commodore . A diferencia de la mayoría de los otros DOS , que se cargan desde el disco a la RAM del ordenador y se ejecutan allí, CBM DOS se ejecuta internamente en la unidad: el DOS reside en chips de ROM dentro de la unidad, y es ejecutado allí por una o más CPU dedicadas de la familia MOS 6502. Por tanto, la transferencia de datos entre ordenadores Commodore de 8 bits y sus unidades de disco se parece más a una conexión de red de área local que a las típicas transferencias de disco/host.

Versiones de CBM DOS

Se sabe que existen al menos siete versiones numeradas de Commodore DOS; la siguiente lista proporciona los números de versión y las unidades de disco relacionadas. A menos que se indique lo contrario, las unidades tienen un formato de 5¼ pulgadas. El código "lp" designa unidades de "perfil bajo". Las unidades cuyo número de modelo comienza con 15 se conectan a través de los protocolos seriales (TALK/LISTEN) de bus IEEE-488 (IEC Bus) exclusivos de Commodore ; todos los demás utilizan el protocolo paralelo IEEE-488 .

La versión 2.6 fue por lejos la versión DOS más utilizada y conocida, debido a su uso en el 1541 como parte de los sistemas C64 .

Nota: El firmware revisado para el modelo 1571 que solucionó el error de archivo relativo también se identificó como V3.0. Por lo tanto, no es posible diferenciar las dos versiones utilizando solo el número de versión.

Descripción técnica

1541 tipos de directorios y archivos

El disquete Commodore 1541 puede contener hasta 144 archivos en un espacio de nombres plano (sin subdirectorios ); el directorio se almacena en la pista reservada 18, que se encuentra a medio camino entre el eje y el borde de un disco de una sola cara de 35 pistas. Un nombre de archivo puede tener hasta 16 bytes de longitud y es teóricamente único; al usar métodos de acceso directo en la estructura de directorios, es posible cambiar el nombre de un archivo por el de otro, aunque acceder a dichos archivos puede ser difícil o imposible. Los archivos con nombres idénticos generalmente no sirven para nada excepto para informar o administrar visualmente los archivos. Un truco popular, utilizado, por ejemplo, por The Final Cartridge III , era agregar archivos nombrados "----------------"de tipo DEL<al directorio, y luego los archivos podían reorganizarse alrededor de esas líneas para formar grupos. Muchos desarrolladores de juegos, miembros de grupos warez y hackers de demoscene también usaron algunas entradas de directorio personalizadas más ingeniosas.

Los nombres de archivo pueden contener un carácter de espacio desplazado ( $A0), y si el listado de directorios se está viendo desde BASIC, la parte del nombre de archivo que se encuentra más allá del $A0carácter aparecerá separada de la primera parte del nombre de archivo por una comilla, lo que hará que BASIC no la considere parte del nombre de archivo completo. Esta característica se puede utilizar para crear entradas de directorio como , que luego aparecerán en el listado de directorios como, por ejemplo,SAVE "PROGRAM⇧ Shiftspace CommodoreDUDE",8,132 "PROGRAMA",8,1 PRG. [1] Cuando el usuario mueve el cursor al principio de la línea, escribe la palabra LOADsobre el tamaño del archivo y presiona , BASIC interpreta eso como , lo que hace que el programa se cargue en la memoria. Todo lo que esté después de los dos puntos o la dirección secundaria no se ejecutará, ya que la computadora ignora cualquier comando después de LOAD. [2] Alternativamente, el usuario podría presionar – para cargar el programa automáticamente. [3]RETURNLOAD "PROGRAM",8,1 ...⇧ ShiftRUN/STOPLOADRUN

Un byte nulo incrustado en un nombre de archivo interrumpirá el listado después de la carga mediante BASIC. Si hay tres bytes nulos, eso dificulta el listado mediante BASIC. Muchos programadores de lenguaje de máquina experimentarían con bytes nulos en un intento de dificultar a los programadores de BASIC el acceso a su código y la manipulación del mismo.

En BASIC, se puede acceder al directorio como un programa pseudo-BASIC no ejecutable con (o en el caso de una unidad dual) seguido de . La primera línea tiene un número de línea de 0 o 1 (que indica el número de unidad), mostrando en video inverso el nombre y el ID del disco y un código abreviado para la versión DOS con la que se creó (los códigos varían solo en la medida en que las versiones DOS usan formatos de disco incompatibles: "2A" es usado por la mayoría de las versiones DOS de 5,25 pulgadas, "3D" por el 1581 de 3,5 pulgadas). Las líneas posteriores tienen el tamaño de un archivo (en bloques de disco) como su pseudo "número de línea", seguido por el nombre del archivo entre comillas y el código de tipo de tres letras. La última línea muestra el número de bloques no asignados en el disco (de nuevo como un pseudo "número de línea"), seguido por las palabras "BLOCKS FREE".LOAD "$0",8LOAD "$1",8LIST

En el Commodore 64 , al ingresar, la pantalla se inundará con basura en lugar de cargar el directorio en la RAM BASIC. Esto se debe a que la unidad asigna al directorio una dirección de carga de $ 0401 (1025), que es equivalente al inicio de BASIC para el Commodore PET , pero corresponde a la memoria de pantalla predeterminada en el C64 (que comienza con el segundo carácter en la primera línea de la pantalla).LOAD "$",8,1

Al visualizar el directorio con un comando se sobrescribe el programa BASIC en la memoria. El DOS Wedge y varios cartuchos y extensores de terceros como Epyx Fast Load , Action Replay y The Final Cartridge III permiten visualizar el directorio del disco mediante comandos especiales que cargan el directorio en la memoria de pantalla sin destruir el programa BASIC actual. Algunas versiones de Commodore BASIC incluyen un comando o que realiza la misma función.LOAD "$",8DIRECTORYCATALOG

Se admiten los siguientes tipos de archivos:

SEQ
Un archivo secuencial es un archivo de datos que se puede leer linealmente de principio a fin. SEQLos archivos se utilizan comúnmente para almacenar documentos o archivos de texto creados por un procesador de texto u otro editor similar. Un archivo secuencial es análogo a un archivo plano en Linux o UNIX , en el sentido de que no tiene una estructura interna especializada. No es posible ubicarlo en cualquier ubicación arbitraria en un archivo secuencial, ya que no existe un análogo de la lseekllamada al núcleo que se encuentra en los sistemas operativos tipo UNIX .
PRG
PRGLos archivos normalmente contienen código de programa ejecutable, aunque también se pueden utilizar para archivos de datos. Los dos primeros bytes PRGson leídos por la rutina "cargar archivo" del núcleo y se utilizan para determinar la dirección de carga (se almacenan en formato little endian ).
REL
Un archivo relativo es una variación del tipo de archivo secuencial, en el que está presente un mecanismo de indexación denominado sectores laterales para permitir el acceso orientado a registros. Los registros pueden tener un tamaño máximo de 254 bytes y se direccionan mediante un número cardinal basado en uno, lo que permite un acceso verdaderamente aleatorio a cualquier parte del archivo.
USR
Un archivo especificado por el usuario tiene una estructura interna idéntica a la de un archivo secuencial. El propósito original de Commodore para este tipo de archivo era facilitar el desarrollo de DOS, ya que el contenido del archivo se podía copiar en un búfer de unidad para su ejecución por el microprocesador de la unidad. Muy pocos programas hicieron uso de este tipo de archivo. Algunas aplicaciones que utilizan estructuras de disco de bajo nivel no estándar guardan los datos en formato USR, que llegó a considerarse una especie de indicación de "déjame en paz, no intentes copiar o eliminar" para el usuario. En particular, los archivos "VLIR" de GEOS se muestran como USRarchivos.
DEL
Un tipo de archivo utilizado internamente y no documentado cuya estructura es similar a la de un archivo secuencial. La creación de este tipo de archivo debe realizarse mediante la manipulación directa del directorio del disco.

La presencia de un asterisco ( *) antepuesto al tipo de archivo en una lista de directorios (por ejemplo, *SEQ) indica que el archivo no se cerró correctamente después de la escritura. Cuando se ordena a la unidad que cierre un archivo que se ha abierto para escritura, el búfer asociado se vacía en el disco y el mapa de disponibilidad de bloques (BAM) se actualiza para reflejar con precisión qué bloques se han utilizado. Si una falla del programa u otro problema (como que el usuario extraiga el disco mientras un archivo está abierto) da como resultado un "archivo huérfano", también conocido como archivo "veneno" o "splat", los búferes no se vacían y el BAM no reflejará con precisión el uso del disco, lo que pone al disco en riesgo de corrupción. Por lo general, no se puede acceder a un archivo venenoso (pero se puede abrir en modo "modificar"), y un intento de usar el scratchcomando DOS para eliminar el archivo puede causar corrupción del sistema de archivos , como enlaces cruzados. El único método práctico para eliminar uno de estos archivos es abrir el archivo en modo "modificar" (y repararlo) o validar el disco (consulte el validatecomando DOS a continuación), lo que reconstruye el BAM y elimina las referencias a archivos venenosos del directorio. El infame error de guardar con reemplazo podría provocar la creación de archivos splat.

*DELes un tipo especial que se escribe en la entrada del directorio del disco de los archivos que se han eliminado. Dichos archivos no se muestran en una lista de directorios normal, y sus bloques de datos y entradas de directorio serán reutilizados por archivos que se creen posteriormente. Algunos programas de utilidad permiten la "recuperación" de dichos archivos si sus bloques de datos y entradas de directorio aún no han sido sobrescritos por otros archivos. DEL filesse utilizan comúnmente para insertar banners o secciones de comentarios en una lista de directorios.

Los tipos de archivos que tienen <después de ellos (por ejemplo, PRG<) están "bloqueados" y no se pueden eliminar; sin embargo, se pueden abrir para leer. No existe ningún comando DOS de Commodore que pueda establecer o borrar explícitamente este estado, pero se escribieron muchas utilidades de terceros para permitir que esto se haga. Estas utilidades generalmente leen el directorio mediante comandos de acceso directo, realizan las modificaciones necesarias a los datos sin procesar y luego escriben los cambios nuevamente en el disco.

Acceso a archivos

El acceso a los archivos es un problema que afecta principalmente al ordenador anfitrión. La ROM del núcleo del ordenador contiene las rutinas primitivas necesarias para acceder a los archivos, y la ROM BASIC contiene una abstracción de nivel superior para el acceso a los archivos mediante la sintaxis BASIC. Los componentes que afectan al propio DOS son el análisis de nombres de archivo y la dirección secundaria. En esta sección se dará una descripción general de los comandos BASIC necesarios para completar el tema.

Abrir un archivo en una unidad de disco Commodore implica el procesamiento de una serie de parámetros que son vagamente análogos a los procedimientos de apertura de archivos en otros entornos. Dado que el DOS se está ejecutando en realidad en el controlador de la unidad, la secuencia de apertura de archivos debe pasar suficiente información a la unidad para garantizar una interpretación inequívoca. Una instrucción típica en BASIC para escribir en un archivo secuencial sería la siguiente:

OPEN 3,8,4,"0:ADDRESSBOOK,S,W"

Los parámetros que siguen al OPEN verbo son los siguientes:

3
Este parámetro, el número de archivo , identifica lógicamente el archivo abierto dentro del sistema operativo de la computadora y es análogo a un descriptor de archivo en sistemas operativos tipo UNIX . Nunca se envía a la unidad y, por lo tanto, no es conocido ni utilizado por el propio sistema operativo de la unidad. El número de archivo puede estar en el rango de 1 a 254 inclusive, lo asigna el programador y debe ser único si se abre más de un archivo simultáneamente. Una vez que se ha abierto el archivo, todos los procedimientos de entrada y salida del programa utilizan el número de archivo. En los programas de lenguaje ensamblador , este valor a menudo se conoce como LA (dirección lógica), la abreviatura proviene de la mnemotecnia que se refiere a la ubicación de memoria donde se almacena el número de archivo. Los números de archivo mayores que 127 hacen que el sistema escriba un salto de línea adicional después de cada retorno de carro (útil para el doble espaciado de un documento, por ejemplo).
8
Este parámetro, el número de dispositivo , identifica un periférico específico conectado a la computadora. Los dispositivos 0 a 3 direccionan el teclado, el casete de cinta, la interfaz RS-232 y la pantalla de video, respectivamente, todos los cuales son controlados directamente por la ROM del núcleo. Los números de dispositivo 4 y superiores direccionan los dispositivos conectados al bus periférico, como impresoras o unidades de disco. En el caso de una unidad de disco, el número de dispositivo se refiere al controlador de la unidad, no al mecanismo o mecanismos de unidad dentro de la unidad. Por convención, la primera unidad de disco en un sistema tiene el número de dispositivo 8, la segunda unidad, si está presente, 9, etc., hasta un número máximo de 15 (cuando se conectan ocho unidades de disco). El esquema de número de dispositivo se derivó del bus IEEE-488 (o interfaz de propósito general GPIB ) que se utilizó con los modelos Commodore PET/CBM. En los programas de lenguaje ensamblador, este valor a menudo se conoce como FA o PA (dirección física), nuevamente a partir del mnemónico para la ubicación de memoria donde se almacena el número de dispositivo.
4
Este parámetro, la dirección secundaria , que puede variar de 0 a 15 inclusive, se refiere a un canal de comunicación específico establecido con el controlador del dispositivo y se pasa al dispositivo cuando se le ordena "hablar" o "escuchar" en el bus periférico. Al igual que con el número de archivo, la dirección secundaria la determina el programador y debe ser única para el dispositivo en cuestión. El rango de 0 a 14 inclusive se utiliza para pasar datos hacia o desde el dispositivo, mientras que 15, conocido como el "canal de comando", se utiliza para emitir comandos al controlador del dispositivo (como cambiar el nombre de un archivo de disco), si el dispositivo puede admitir dicha operación. En las unidades de disco, las direcciones secundarias de 0 a 14 inclusive se asignan a búferes dentro del controlador, estableciendo así la comunicación con un archivo específico en un disco específico; dado que, como se mencionó anteriormente, la unidad no conoce el número de archivo , solo puede usar la dirección secundaria para marcar la diferencia entre varios archivos que están abiertos al mismo tiempo. Por otro lado, el sistema operativo host es agnóstico sobre la dirección secundaria; Se transmite a la unidad cada vez que se accede al archivo, pero el host no lo utiliza de ninguna otra forma. En los programas en lenguaje ensamblador, este valor suele denominarse SA (dirección secundaria).
CADENA DE COMANDOS
En la documentación de Commodore, el "0:ADDRESSBOOK,S,W"parámetro se conoce oficialmente como la cadena de comandos y lo interpreta el controlador del dispositivo al que se accede. En el caso de una unidad de disco, la estructura formal de la cadena de comandos consta del número del mecanismo de la unidad ( 0:, que no debe confundirse con el número del dispositivo), el nombre del archivo ( ADDRESSBOOK), el tipo de archivo ( S, secuencial en este ejemplo) y el modo de acceso ( W, abierto para escritura en este ejemplo). En la práctica, algunos de estos parámetros pueden omitirse. Como mínimo, solo se requiere el nombre del archivo si el archivo se va a abrir para lectura.
El número de unidad identifica un mecanismo de unidad conectado al controlador de una unidad de disco y es análogo a un número de unidad lógica en un controlador SCSI que es capaz de controlar múltiples mecanismos (por ejemplo, los controladores OMTI SASI que se desarrollaron para funcionar con discos duros ST-412 / ST-506 en la década de 1980). En las unidades de disquete, el primer mecanismo es la unidad 0: y el segundo es 1:. Es una práctica bastante común omitir el número de unidad cuando se comunica con una unidad de disquete de una sola unidad, ya que 0: es el valor predeterminado en dichas unidades, pero dado que omitir el número puede desencadenar algunos errores oscuros en el DOS, no es una práctica recomendada (dos puntos solo es equivalente a 0: y es suficiente para evitar esos errores). Una excepción a esta convención es el subsistema de disco duro Lt. Kernal , en el que el número de unidad se refiere a "unidades lógicas" ( unidades virtuales creadas en una sola unidad física), lo que hacía necesaria una sintaxis como 4: o 10: si un archivo que se iba a abrir no estaba en la unidad lógica cero (equivalente al mecanismo de unidad cero en una unidad de disquete dual).

Los archivos también se pueden cargar y guardar con los comandos LOADy SAVE. Aquí también se pueden usar especificadores de nombre de archivo, por ejemplo, guarda el programa BASIC en un archivo (de programa) y guarda el programa BASIC en un archivo secuencial. Si no se especifica la dirección secundaria o se especifica como 0 (por ejemplo, ), el archivo se guarda/carga desde el área de memoria BASIC (que, en el C64, comienza de manera predeterminada en $ 0801). Si la dirección secundaria se especifica como un valor distinto de cero (por ejemplo, ), el programa se carga comenzando desde la dirección especificada por el propio archivo (el encabezado PRG, que son los primeros dos bytes del archivo); esta forma de comando es más común cuando se cargan programas de código de máquina.SAVE "FILE",8PRGSAVE "0:FILE,SEQ,WRITE",8,1LOAD "FILE",8LOAD "FILE",8,1

La reubicación de carga se introdujo por primera vez en el VIC-20 porque esta máquina podía iniciar la RAM BASIC en varias ubicaciones diferentes, dependiendo de la expansión de memoria que se instalara. La serie PET de Commodore anterior no admitía la reubicación, por lo que tendría el mismo efecto: el archivo se cargaría en la misma región de memoria desde la que se guardó. La reubicación de carga se produce en el host, siendo una excepción a lo que se dijo anteriormente sobre la dirección secundaria que se utiliza solo internamente en el dispositivo. Dado que el PET no puede reubicar archivos, los programas BASIC escritos en máquinas Commodore posteriores deben modificarse utilizando un editor de sectores para cambiar los bytes de encabezado. También es posible utilizar el monitor de lenguaje de máquina integrado del PET para cambiar la dirección de enlace del programa BASIC después de cargarlo.LOAD "FILE",8LOAD "FILE",8,1

El comando cargará el primer programa en el disco comenzando desde la ubicación de memoria especificada por el archivo. Este es uno de los comandos de carga más populares de las plataformas, el método para iniciar la mayoría del software comercial, por ejemplo. Cabe destacar el hecho de que la expansión de comodines solo seleccionará el primer nombre de catálogo cuando no se haya accedido antes a ningún otro archivo en ese disco; el nombre del último archivo utilizado se mantiene en la memoria y los comandos posteriores cargarán ese archivo en lugar del primero. (Sin embargo, or siempre cargará el primer archivo en el disco).LOAD "*",8,1LOAD "*",8,1LOAD "0:*",8,1LOAD ":*",8,1

Los directorios de los discos en unidades de dos unidades se acceden como y . y no acceden al directorio sino a los archivos reales en una unidad u otra que casualmente se llaman . Los directorios parciales se pueden cargar agregando dos puntos y una plantilla: por ejemplo, cargaría un directorio parcial que muestre solo los archivos cuyo nombre comience con la letra K y que sean del tipo PRG; todos esos directorios parciales aún contienen la línea inicial del nombre del disco y la línea final "BLOCKS FREE".LOAD "$0", 8LOAD "$1", 8"0:$""1:$""$"LOAD "$0:K*=P",8

El error de guardar con reemplazo

Commodore DOS también ofrece un comando "Save-with-Replace", que permite guardar un archivo sobre un archivo existente sin necesidad de guardar primero SCRATCHel archivo existente. Esto se hacía anteponiendo un @símbolo al nombre del archivo durante la operación OPENor - por ejemplo, . Durante años corrieron rumores, comenzando con la unidad 4040, de un error en la implementación del comando. Al principio, algunos comentaristas lo negaron. Se ofrecieron premios para demostrar la existencia del error. [4] A principios de 1985 , la revista Compute! recomendó a los lectores que evitaran usar el comando. [5] Ese año, varios autores publicaron artículos de forma independiente [4] [6] [7] [8] que demostraban que el error de Save-with-Replace era real e incluían métodos por los cuales podía activarse.SAVESAVE "@MY PROGRAM",8

Los dispositivos afectados incluían el 1541 de una sola unidad y el 4040 de dos unidades; el 8050 y el 8250 no presentaban el problema. [4] Algunos comentaristas sugirieron que el error se podía evitar especificando siempre explícitamente el 0:número de unidad al guardar, [6] aunque más tarde se demostró que cualquier operación de disco sin un número de unidad era suficiente para provocar el error. [9] El error se originó en el hecho de que las implementaciones de DOS afectadas eran versiones modificadas del DOS contenido en las unidades duales Commodore PET anteriores, como el 8050. Esto creaba una "unidad fantasma 1:" en sistemas de una sola unidad, lo que daba como resultado la asignación de un búfer innecesario en algunas condiciones. Dado que el comando Save-with-Replace usaba los cinco búferes de la unidad, y debido a que el método por el cual se asignaba el búfer "fantasma" no cumplía con las especificaciones, esto daba como resultado que se escribieran datos codificados en el disco en algunas condiciones.

En septiembre de 1986, Philip A. Slaymaker publicó un artículo [10] que describía con gran detalle la causa del error y proporcionaba parches para las ROM de la unidad 1541; los lectores con un quemador de EPROM podían producir sus propias ROM parcheadas que podían ser intercambiadas en la unidad. Commodore fue informado de los hallazgos de Slaymaker y, aunque nunca publicó una actualización oficial para las ROM de la 1541 original, sí corrigieron el error en la Revisión 5 de las ROM de la 1571, y también en las ROM de las unidades 1541-c y 1541-II. Aunque Commodore no lo soporta, se sabe que el firmware de la 1541-II (pero no el de la 1541-c) también se puede utilizar en una unidad 1541 original mediante el uso de EPROM, lo que también solucionará el error de esa unidad.

Canal de comando

Como se mencionó anteriormente, el acceso al DOS de Commodore se realiza a través del "canal de comandos", utilizando una sintaxis similar a la que se utiliza para acceder a los archivos. La emisión de comandos al DOS y la recuperación de los mensajes de estado y de error generados en respuesta a los comandos se logra abriendo un archivo en el dispositivo utilizando 15 como dirección secundaria, por ejemplo:

OPEN 1,8,15

Para recuperar y mostrar el estado del dispositivo, se podría codificar:

OPEN 1,8,15:INPUT#1,E,E$,T,S:PRINT E,E$,T,S:CLOSE 1

En el ejemplo anterior, Econtendrá el número de error (si lo hay; será cero si no existe ningún error), E$será una breve descripción del error, Trepresentará la pista del disco donde ocurrió el error y Sserá el sector de la pista Tal que se refiere el error. Si no existe ningún error, el equivalente de00,OK,00,00se devolverá en las cuatro variables. Tenga en cuenta que INPUT#es un verbo que solo se ejecuta en modo de ejecución. Además, en los programas que emiten muchos comandos de disco, es habitual abrir un archivo en el canal de comandos del dispositivo al inicio del programa y no cerrarlo hasta que el programa haya terminado.

Las versiones 4.0 y posteriores de Commodore BASIC proporcionan una pseudovariable denominada DS$que se puede utilizar para recuperar el estado de la unidad en lugar del código anterior. Esta variable reservada no está disponible en versiones anteriores de BASIC, por lo que el canal de comandos debe leerse manualmente como se demostró anteriormente. Tenga en cuenta que inmediatamente después del encendido o reinicio, se devolverá la revisión de DOS. Por ejemplo, un 1541 devolverá73, CBM DOS V2.6 1541,00,00El código de error 73 es común a todos los modelos de unidad y puede usarse para determinar si la unidad se ha restablecido a su estado de encendido.

Comandos DOS

También hay un comando para buscar en archivos de tipo RELative ( RECORD#), varios comandos de acceso directo a nivel de bloque ( BLOCK-READ, BLOCK-WRITE, BUFFER-POINTER), administración de bloques ( BLOCK-ALLOCATE, BLOCK-FREE), manipulación de la memoria de la unidad y ejecución de código de programa en el procesador de la unidad ( MEMORY-WRITE, MEMORY-READ, MEMORY-EXECUTE, BLOCK-EXECUTE) y funciones definibles por el usuario ( USERy &comandos). Algunas de las funciones teóricamente definibles por el usuario se rededicaron para acceder a nuevas funcionalidades en las versiones de DOS posteriores a la 1.0.

Referencias

  1. ^ Sturdivant, Jerry A. (febrero-marzo de 1985). "Quick Load". Commodore Power/Play . Vol. 4, no. 1. p. 54 . Consultado el 7 de octubre de 2018 .
  2. ^ Brannon, Charles (diciembre de 1983). "Horizontes: 64". Gaceta de COMPUTE!. N.º 6. pág. 178. Consultado el 7 de octubre de 2018 .
  3. ^ Grace, Paul (1986). "Un tipo extraño". Número especial de RUN , 1987. Peterborough, New Hampshire: CW Communications/Peterborough, Inc. Consultado el 7 de octubre de 2018 .
  4. ^ abc Whittern, Charles H. (julio de 1985). "Ahorre con Replace Exposed!". The Transactor . 6 (1): 20.
  5. ^ "El gran debate sobre guardar/reemplazar el Commodore". Compute! . Febrero de 1985. p. 10 . Consultado el 6 de octubre de 2013 .
  6. ^ ab Slaymaker, PA (octubre de 1985). "Guardar con reemplazar: depurado por fin / Parte 1". Compute! . p. 79 . Consultado el 16 de octubre de 2013 .
  7. ^ Slaymaker, PA (noviembre de 1985). "Guardar con reemplazo: depurado por fin / Parte 2". Compute! . p. 111 . Consultado el 30 de octubre de 2013 .
  8. ^ Editores. "Save@: La teoría de Gerry Neufield sobre un viejo bicho". Info № 9, diciembre de 1985/enero de 1986.
  9. ^ Extracto del correo electrónico de Philip A. Slaymaker también archivado en Groups.Google
  10. ^ Philip A. Slaymaker. "Eliminación de errores de SAVE@ y otros 1541". The Transactor Vol. 7 № O2, septiembre de 1986, págs. 33–35.
Notas