KERNAL
| KERNAL | ||
|---|---|---|
|
| ||
| Informações gerais | ||
| tipo de programa | núcleo | |
| desenvolvedor | Comodoro Internacional | |
| Modelo de desenvolvimento | fonte fechada | |
| Estado atual | descontínuo | |
| Informação técnica | ||
| Plataformas compatíveis | ||
KERNAL [ 1 ] é o nome designado do Commodore para o kernel do sistema operacional residente em ROM em seus computadores domésticos de 8 bits ; do PET original de 1977 , seguido pelas versões estreitamente relacionadas, mas estendidas, usadas em seus sucessores: VIC-20 , Commodore 64 , Plus/4 , C16 e C128 .
Descrição
O KERNAL de máquinas Commodore de 8 bits consiste em rotinas de sistema operacional de baixo nível e quase hardware equivalente ao BIOS em PCs compatíveis com IBM ( em contraste com as rotinas de intérprete BASIC, também localizadas em ROM), bem como funcionalidade de E/S independente de dispositivo de nível, e pode ser chamada pelo usuário por meio de uma tabela de saltos cuja parte do meio (mais antiga), por motivos de compatibilidade com versões anteriores, [ 2 ] permanece praticamente idêntica em toda a série de 8 bits. A ROM KERNAL ocupa os últimos 8 KB do espaço de endereçamento de 64 KB da CPU de 8 bits ($E000-$FFFF).
A tabela de salto pode ser modificada para apontar para rotinas escritas pelo usuário, por exemplo, reescrevendo as rotinas de exibição de tela para exibir gráficos animados ou copiando o conjunto de caracteres na RAM. Esse uso de uma mesa de salto era novo para computadores pequenos na época. [ 3 ]
Os jogos Adventure International lançados para o VIC-20 em cartucho são um exemplo de software usando KERNAL. Como eles usam apenas a tabela de saltos, os jogos podem ser baixados na memória do disco , carregados em um Commodore 64 e executados sem modificação. [ 4 ]
O KERNAL foi escrito inicialmente para o Commodore PET por John Feagans, que introduziu a ideia de separar as rotinas BASIC do sistema operacional. Foi desenvolvido por várias pessoas, mais notavelmente Robert Russell, que adicionou muitos dos recursos para o VIC-20 e C64.
Exemplo
A seguinte sub- rotina de linguagem assembly 6502 [ 5 ] (escrita no formato/sintaxe do assembler ca65) fornece um exemplo simples, mas característico do uso de KERNAL:
CHROUT = $ffd2 ; CHROUT é o endereço da rotina de saída de caracteres
CR = $0d ; Código PETSCII para devolução de carro
;
Olá:
ldx #0 ; comece com o caractere 0 carregando 0 no registrador de índice x
próximo:
mensagem lda , x ; carregar byte da mensagem de endereço + x no acumulador
beq feito ; se o acumulador mantiver zero, terminamos e queremos sair do loop
jsr CHROUT ; chame CHROUT para enviar char para o dispositivo de saída atual (o padrão é a tela)
em x ; incrementa x para passar para o próximo caractere
b ne próximo ; loop back enquanto o último caractere não é zero (comprimento máximo da string 255 bytes)
doar:
rs ; retorno da sub-rotina
;
mensagem:
.byte "Olá mundo"
.byte CR , 0 ; Retorno de carro e final de marcação zero da string
Este stub usa a rotina CHROUT, cujo endereço está no endereço $FFD2(65490), para enviar uma string de texto para o dispositivo de saída padrão (por exemplo, a tela de exibição).
O nome
O KERNAL era conhecido como kernel [ 6 ] dentro do Commodore desde os dias do PET, mas em 1980 Robert Russell escreveu incorretamente a palavra kernal em seus cadernos. Quando os escritores técnicos da Commodore, Neil Harris e Andy Finkel, pegaram as notas de Russell e as usaram como base para o manual do programador VIC-20, o erro de ortografia os seguiu e permaneceu como estava. [ 7 ]
De acordo com o antigo mito do Commodore, e relatado pelo escritor/programador Jim Butterfield, entre outros, a " palavra " KERNAL é um acrônimo (ou talvez mais provavelmente, um retro-acrônimo ) que significa Keyboard Entry Read , Network , A nd L tinta. , o que realmente faz sentido considerando seu papel. Mais tarde, a Berkeley Softworks o usou ao nomear as rotinas principais de seu sistema operacional GUI para computadores domésticos de 8 bits: o GEOS KERNAL.
Em E/S independente do dispositivo
Surpreendentemente, o KERNAL implementou uma API de E/S independente de dispositivo que não é totalmente diferente do Unix ou do Plan-9 , que ninguém explorou, até onde é conhecido publicamente. Enquanto se poderia argumentar razoavelmente que "tudo é um arquivo" nos últimos sistemas, outros poderiam facilmente afirmar que "tudo é um dispositivo GPIB " no primeiro.
Devido às limitações da arquitetura 6502 na época, a abertura de um canal de E/S requer três chamadas de sistema. O primeiro geralmente define o nome do arquivo lógico por meio do SETNAM. A segunda chamada, SETLFS, define o endereço do "dispositivo" GPIB/IEEE-488 com o qual se comunicar. Finalmente é chamado para OPENrealizar a transação real. O aplicativo então usa as chamadas de sistema CHKINe para CHKOUTconfigurar os canais de entrada e saída atuais do aplicativo, respectivamente. Os aplicativos podem ter qualquer número de arquivos abertos simultaneamente (até algum limite dependente do sistema; por exemplo, o C64 permite que dez arquivos sejam abertos ao mesmo tempo). Depois disso, CHRINe CHROUTsão úteis para entrada e saída, respectivamente. CLOSEem seguida, feche um canal.
Observe que não há chamada de sistema para "criar" um canal de E/S, pois os dispositivos não podem ser criados ou destruídos dinamicamente em circunstâncias normais. Da mesma forma, não há meios de buscar, nem de executar funções de "controle de E/S" como ioctl () no Unix. De fato, o KERNAL demonstra muito mais próximo da filosofia do Plan-9 aqui, onde uma aplicação abriria um canal especial de " comando " para o dispositivo indicado para realizar tais transações " meta " ou " fora de banda ". Por exemplo, para " raspar " um arquivo de um disco, o usuário normalmente "abriria" o recurso nomeado S0:THE-FILE-TO-RMVno dispositivo 8 ou 9, canal 15. Por convenção estabelecida no mundo Commodore de 8 bits, o canal 15 representa o "canal de comando " para periféricos, contando com técnicas de mensagens para comunicar comandos e resultados, incluindo casos raros. Por exemplo, no Commodore BASIC , você pode encontrar um software semelhante ao seguinte:
70 ...
80 REM ROTATE LOGS ATUALMENTE ABERTOS NO CANAL LÓGICO #1.
90 CLOSE 1
100 OPEN 15 , 8 , 15 , "R0:ERROR.1=0:ERROR.0" : REM RENOMEAR FILE ERROR.0 TO ERROR.1
110 INPUT# 15 , A , B$ , C , D : REM LEIA ERRO CANAL
120 FECHAR 15
130 SE A = 0 ENTÃO IR PARA 200
140 IMPRIMIR "ERRO RENOMEAR ARQUIVO DE LOG:"
150 IMPRIMIR " CÓDIGO: " + A
160 IMPRIMIR " MSG : " + B$
170 TERMINAR
200 REM CONTINUAR PROCESSANDO AQUI, CRIANDO NOVO ARQUIVO DE LOG À medida que avançamos...
210 OPEN 1 , 8 , 1 , "0:ERROR.0,S,W"
220 ...
Os números dos dispositivos, conforme documentação estabelecida, estão restritos ao intervalo [0,16]. No entanto, esta limitação decorre da adaptação específica do protocolo IEEE-488 e, com efeito, aplica-se apenas a periféricos externos. Com todas as chamadas de sistema KERNAL relevantes vetorizadas, os programadores podem interceptar chamadas de sistema para implementar dispositivos virtuais com qualquer endereço na faixa de 32.256). Pode-se carregar um driver de dispositivo binário na memória, corrigir os vetores de E/S KERNAL e, a partir de então, um novo dispositivo (virtual) pode ser endereçado. Até agora, esse recurso nunca foi conhecido publicamente para ser usado, presumivelmente por dois motivos: (1) KERNAL não fornece meios de atribuir IDs de dispositivo dinamicamente e (2) KERNAL não fornece meios de carregar uma imagem binária realocável. Assim, o ônus das colisões no espaço de E/S e no espaço de memória recai sobre o usuário, enquanto a compatibilidade de plataforma em uma ampla variedade de máquinas recai sobre o autor do software. No entanto, o software de suporte para essas funções pode ser facilmente implementado, se desejado.
Os formatos de nome de arquivo lógico tendem a depender do dispositivo específico endereçado. O dispositivo mais comum usado, é claro, é o sistema de disquete, que usa um formato semelhante a MD:NAME,ATTRS, onde M é algum tipo de sinalizador ($ para listagem de diretórios, @ para indicar o desejo de sobrescrever um arquivo se ele já existir, caso contrário não utilizado ), D é o número da unidade de disco físico (opcional) (0: ou 1: para sistemas de unidade dupla, apenas 0: para unidades de disco único como 1541, et al., cujo padrão é 0: se não especificado) , NAMEé um nome de recurso de até 16 caracteres (a maioria dos caracteres permitidos, exceto alguns caracteres especiais) e ATTRSé uma lista opcional de atributos ou sinalizadores separados por vírgulas. Por exemplo, se o usuário quiser sobrescrever um arquivo de programa chamado PRGFILE, ele poderá ver um nome de arquivo @0:PRGFILE,Pusado em conjunto com o dispositivo 8 ou 9. Enquanto isso, um nome de arquivo para o controlador RS-232 (dispositivo 2) consiste simplesmente em quatro caracteres , codificado em formato binário. [ 8 ]
Outros dispositivos, como o teclado (dispositivo 0), o cassete (dispositivo 1), a interface de exibição (dispositivo 3) e a impressora (dispositivo 4 e 5), não exigem nomes de arquivos para funcionar, assumindo padrões razoáveis ou apenas eles não precisa deles. em absoluto.
Referências
- ↑ Guia de referência do programador do Commodore 64 . Commodore Business Machines, Inc., 1982, p. 268
- ↑ A tabela de salto KERNAL, usada para acessar todas as sub-rotinas no KERNAL, é um array de instruções JMP (salto) que levam às sub-rotinas reais. Esse recurso garante a compatibilidade com o software escrito pelo usuário no caso de o código dentro do KERNAL ROM precisar ser realocado em uma revisão posterior.
- ^ "Explorando o VIC-20" .
- ↑ Kevelson, Morton (janeiro de 1986). "Sintetizadores de fala para os computadores Commodore / Parte II" . pág. 32 . Recuperado em 17 de julho de 2014 .
- ↑ Muitas das sub-rotinas KERNAL (por exemplo, OPEN e CLOSE) foram vetorizadas através da página três na RAM, permitindo que um programador interceptasse as chamadas KERNAL associadas e adicionasse ou substituísse as funções originais.
- ↑ O kernel é a parte mais fundamental de um programa, normalmente um sistema operacional, que reside na memória o tempo todo e fornece os serviços básicos. É a parte do sistema operacional que está mais próxima da máquina e pode ativar o hardware diretamente ou fazer interface com outra camada de software que aciona o hardware
- ↑ On The Edge: The Spectacular Rise and Fall of Commodore , página 202.
- ↑ Commodore 128 Programmers Reference Guide , Commodore Business Machines, Inc., 1986, p. 382
Veja também
- GEOS , sistema operacional gráfico para o Commodore 64 e 128.