# KERNAL

KERNAL es el nombre designado por Commodore para el núcleo del sistema operativo residente en ROM en sus computadoras domésticas de 8 bits; desde el PET original de 1977, seguido de las versiones extendidas pero fuertemente relacionadas utilizadas en sus sucesores: el VIC-20, Commodore 64, Plus/4, C16 y C128.

## Descripción

El KERNAL de las máquinas Commodore de 8 bits consta de rutinas del sistema operativo de bajo nivel, cercanas al hardware, más o menos equivalentes al BIOS en las PC compatibles con IBM (en contraste con las rutinas del intérprete BASIC, también ubicadas en ROM), así como funcionalidad de E/S independiente del dispositivo de nivel superior, y puede ser llamada por el usuario a través de una tabla de saltos cuya parte central (la más antigua), por razones de compatibilidad con versiones anteriores, permanece en gran medida idéntica en toda la serie de 8 bits. La ROM KERNAL ocupa los últimos 8 KB del espacio de direcciones de los 64 KB de la CPU de 8 bits ($E000- $FFFF).
La tabla de salto se puede modificar para apuntar a rutinas escritas por el usuario, por ejemplo, reescribiendo las rutinas de visualización de pantalla para mostrar gráficos animados o copiando el conjunto de caracteres en la RAM. Este uso de una mesa de salto era nuevo para las computadoras pequeñas en ese momento.
Los juegos de Adventure International publicados para el VIC-20 en cartucho son un ejemplo de software que utiliza KERNAL. Debido a que solo usan la tabla de salto, los juegos pueden descargarse en la memoria del disco, cargarse en un Commodore 64 y ejecutarse sin modificaciones.
El KERNAL fue escrito inicialmente para el Commodore PET por John Feagans, quien introdujo la idea de separar las rutinas de BASIC del sistema operativo. Fue desarrollado por varias personas, especialmente Robert Russell, quien agregó muchas de las características para el VIC-20 y el C64.

## Ejemplo

La siguiente subrutina de lenguaje ensamblador 6502 (escrita en formato/sintaxis de ensamblador ca65) proporciona un ejemplo simple pero característico del uso de KERNAL:
Este código auxiliar emplea la rutina CHROUT, cuya dirección se encuentra en la dirección $FFD2 (65490), para enviar una cadena de texto al dispositivo de salida predeterminado (por ejemplo, la pantalla de visualización).

## El nombre

El KERNAL era conocido como kernel dentro de Commodore desde los días de PET, pero en 1980 Robert Russell escribió mal la palabra como kernal en sus cuadernos. Cuando los escritores técnicos de Commodore Neil Harris y Andy Finkel recogieron las notas de Russell y las usaron como base para el manual del programador VIC-20, la falta de ortografía los siguió y quedó como estaba.
Según el antiguo mito de Commodore, e informado por el escritor/programador Jim Butterfield, entre otros, la "palabra" KERNAL es un acrónimo (o quizás más probable, un retroacrónimo) que significa Keyboard Entry Read, Network, And Link., lo que de hecho tiene sentido teniendo en cuenta su papel. Berkeley Softworks más tarde lo usó al nombrar las rutinas centrales de su sistema operativo GUI para computadoras hogareñas de 8 bits: el GEOS KERNAL.

## En E/S independientes del dispositivo

Sorprendentemente, el KERNAL implementó una API de E/S independiente del dispositivo que no es completamente diferente de la de Unix o Plan-9, que nadie explotó, hasta donde se sabe públicamente. Mientras que uno podría argumentar razonablemente que "todo es un archivo" en estos últimos sistemas, otros podrían afirmar fácilmente que "todo es un dispositivo GPIB" en el primero.
Debido a las limitaciones con la arquitectura 6502 en ese momento, abrir un canal de E/S requiere tres llamadas al sistema. El primero generalmente establece el nombre de archivo lógico a través de la llamada SETNAM. La segunda llamada, SETLFS, establece la dirección del "dispositivo" GPIB/IEEE-488 para comunicarse. Finalmente se llama a OPEN para realizar la transacción real. Luego, la aplicación utiliza las llamadas al sistema CHKIN y CHKOUT para configurar los canales de entrada y salida actuales de la aplicación, respectivamente. Las aplicaciones pueden tener cualquier cantidad de archivos abiertos simultáneamente (hasta cierto límite dependiente del sistema; por ejemplo, el C64 permite que se abran diez archivos a la vez). A partir de entonces, CHRIN y CHROUT resultan útiles para realizar entradas y salidas, respectivamente. CLOSE luego cierra un canal.
Observe que no existe una llamada al sistema para "crear" un canal de E/S, ya que los dispositivos no pueden crearse ni destruirse dinámicamente en circunstancias normales. Del mismo modo, no existen medios para buscar, ni para realizar funciones de "control de E/S" como ioctl en Unix. De hecho, el KERNAL demuestra mucho más cerca de la filosofía del Plan-9 aquí, donde una aplicación abriría un canal especial de "command" al dispositivo indicado para realizar tales transacciones "meta" o "out-of-band". Por ejemplo, para eliminar ("scratch") un archivo de un disco, el usuario normalmente "abrirá" el recurso llamado S0:THE-FILE-TO-RMV en el dispositivo 8 o 9, canal 15. Según la convención establecida en el mundo Commodore de 8 bits, el canal 15 representa el "canal de comando" para los periféricos, basándose en técnicas de transmisión de mensajes para comunicar comandos y resultados, incluidos casos excepcionales. Por ejemplo, en Commodore BASIC, pueden encontrar software similar al siguiente:
Los números de dispositivo, según la documentación establecida, están restringidos al rango [0,16]. Sin embargo, esta limitación proviene de la adaptación específica del protocolo IEEE-488 y, en efecto, se aplica solo a periféricos externos. Con todas las llamadas relevantes del sistema KERNAL vectorizadas, los programadores pueden interceptar llamadas del sistema para implementar dispositivos virtuales con cualquier dirección en el rango de 32,256). Posiblemente, uno puede cargar un controlador de dispositivo binario en la memoria, parchear los vectores de E/S KERNAL y, a partir de ese momento, se podría abordar un nuevo dispositivo (virtual). Hasta ahora, esta capacidad nunca se ha conocido públicamente como utilizada, presumiblemente por dos razones: (1) KERNAL no proporciona medios para asignar dinámicamente ID de dispositivo, y (2) KERNAL no proporciona medios para cargar una imagen binaria reubicable. Por lo tanto, la carga de las colisiones tanto en el espacio de E/S como en el espacio de memoria recae en el usuario, mientras que la compatibilidad de la plataforma en una amplia gama de máquinas recae en el autor del software. No obstante, el software de soporte para estas funciones podría implementarse fácilmente si se desea.
Los formatos lógicos de nombre de archivo tienden a depender del dispositivo específico direccionado. El dispositivo más común utilizado, por supuesto, es el sistema de disquete, que usa un formato similar a MD:NAME,ATTRS, donde M es una especie de bandera ($ para el listado del directorio, @ para indicar el deseo de sobrescribir un archivo si ya existe, sin usar de otra manera), D es el número de unidad de disco físico (opcional) (0: o 1: para sistemas de doble unidad, solo 0: para unidades de disco único como el 1541, et al., que por defecto es 0: si no se especifica), NAME es un nombre de recurso de hasta 16 caracteres de longitud (la mayoría de los caracteres permitidos, excepto ciertos caracteres especiales), y ATTRS es una lista opcional de atributos o indicadores separados por comas. Por ejemplo, si el usuario desea sobrescribir un archivo de programa llamado PRGFILE, podría ver un nombre de archivo como @0:PRGFILE,P usado junto con el dispositivo 8 o 9. Mientras tanto, un nombre de archivo para el controlador RS-232 (dispositivo 2) consta simplemente de cuatro caracteres, codificados en formato binario.
Otros dispositivos, como el teclado (dispositivo 0), el casete (dispositivo 1), la interfaz de pantalla (dispositivo 3) y la impresora (dispositivo 4 y 5), no requieren nombres de archivo para funcionar, suponiendo valores predeterminados razonables o simplemente no los necesitan. en absoluto.