CP/M (Control Program/Monitor ou Control Program for Microcomputers: "programa de controle para microcomputadores") é um sistema operacional de disco originalmente criado por Gary Kildall da Digital Research para microcomputadores baseados em microprocessadores Intel 8080/85. Inicialmente, seu uso era limitado a um único usuário/tarefa em processadores de 8 bits com pouco mais de 64 kB de RAM, embora versões posteriores tenham adicionado recursos multiusuário/multitarefa e tenham sido adaptadas para CPUs de 16 bits.

A combinação do CP/M com computadores pessoais e o barramento S-100, iniciada com o MITS Altair 8800, foi um dos primeiros padrões da indústria para microcomputadores e foi amplamente utilizada desde a década de 1970 até meados da década de 1980. Ao reduzir drasticamente a quantidade de programação necessária para instalar um aplicativo num computador de um novo fabricante, o CP/M impulsionou os mercados tanto de software quanto de hardware.

Modelo de hardware miniatura|Computador "Sanco 8001" com o CP/M 2.2 em execução. Um sistema CP/M de 8 bits, geralmente contém os seguintes componentes: um terminal de computador com o conjunto de caracteres ASCII; um microprocessador Intel 8080 (e posteriormente, 8085 ou Z80); pelo menos 16 kB de RAM; um meio para iniciar o carregamento do primeiro setor de um disquete na memória; pelo menos uma unidade de disco.

O único hardware compatível com CP/M, na versão distribuída pela Digital Research, era o Intel 8080 Development System. Os fabricantes de sistemas compatíveis com CP/M adaptavam partes do sistema operacional para suas próprias combinações de memória instalada, unidades de disco e entrada de console. O CP/M também podia rodar em sistemas baseados no processador Zilog Z80, uma vez que o Z80 era capaz de executar código do 8080. Embora o CP/M não fosse capaz de executar nenhuma das instruções específicas do Z80, muitos aplicativos foram programados para máquinas CP/M baseadas nesse processador.

Em muitas máquinas, o bootstrap era um programa mínimo armazenado em ROM; em outras, esse programa precisava ser inserido diretamente na memória por meio de um painel frontal sempre que o sistema operacional era carregado.

O CP/M utilizava um conjunto ASCII de 7 bits (128 caracteres). Os outros 128 caracteres possíveis em um conjunto de 8 bits não eram padronizados. Por exemplo, um modelo da Kaypro os utilizava para armazenar caracteres do alfabeto grego, enquanto as máquinas Osborne usavam o oitavo bit para indicar o caractere de sublinhado. Sistemas CP/M internacionais frequentemente utilizavam o padrão ISO 646 para adaptar conjuntos de caracteres, substituindo certos caracteres ASCII por caracteres de idiomas locais, em vez de adicioná-los além do limite de 7 bits.

Componentes do sistema operacional Nas versões de 8 bits, o kernel do CP/M era dividido em três componentes: o Console Command Processor (ou CCP), o Basic Disk Operating System (ou BDOS) e o Basic Input/Output System (ou BIOS). O CCP e o BDOS eram idênticos em todas as instalações de uma determinada versão do CP/M, mas o componente BIOS era sempre adaptado ao hardware específico. Adicionar memória a um computador, por exemplo, significava que o sistema CP/M precisava ser reinstalado. Uma vez instalado, o sistema operacional era armazenado em espaços reservados no início de qualquer disco utilizado para inicializar o sistema. Na inicialização, o carregador de inicialização (boot loader) carrega o sistema operacional a partir do disquete na unidade A:.

Para os padrões modernos, o CP/M era primitivo devido a restrições extremas quanto ao tamanho dos programas. Na versão 1.0, a troca de disquete não era detectada. Se um usuário trocasse os discos sem ler novamente o diretório de arquivos de forma manual, o sistema sobrescreveria o novo disco utilizando as informações de diretório do disco antigo, destruindo os dados armazenados no novo disquete. A partir da versão 1.1 ou 1.2, esse problema foi amenizado: se alguém trocasse os discos sem ler o diretório do novo disco e tentasse gravar nele, o sistema operacional emitia um aviso de erro, impedindo a sobrescrita, mas exigindo uma reinicialização (o que levava apenas alguns segundos, mas resultava na perda de todos os dados na memória).

A maior parte da complexidade do CP/M estava isolada no BDOS e, em menor grau, no CCP. Isso significava que, ao portar o número limitado de comandos simples do BIOS para uma plataforma de hardware específica, todo o sistema operacional passava a funcionar. Tal característica reduziu significativamente o tempo de desenvolvimento necessário para dar suporte a novas máquinas e foi uma das principais razões para a ampla utilização do CP/M. Hoje, esse tipo de abstração é comum à maioria dos sistemas operacionais, mas, na época em que o CP/M foi criado, os sistemas operacionais eram tipicamente projetados para rodar numa única plataforma de hardware, e sistemas multiplataforma eram considerados desnecessários.

Processador de Comandos do Console O Console Command Processor (CCP, ou Processador de Comandos do Console) recebe entradas do teclado e transmite resultados para o terminal. O CP/M pode operar com uma impressora ou com um terminal de vídeo. Todos os comandos do CP/M estão integrados ao interpretador de comandos. O console normalmente exibe o prompt A> na tela para indicar a unidade de disco padrão atual. Quando utilizado com um terminal de vídeo, esse prompt aparece ao lado de um cursor piscante — fornecido pelo terminal —, indicando que o CCP está aguardando a entrada do usuário.

Um comando interno do CCP — a letra da unidade seguida por dois-pontos — permite selecionar a unidade padrão. Por exemplo, se você digitar B: e pressionar a tecla Enter no prompt de comando, a unidade padrão mudará para B, e o próprio interpretador exibirá essa alteração.

A linha de comando do CP/M foi padronizada com base nos sistemas operacionais da Digital Equipment, como o RT-11 para o PDP-11 e o OS/8 para o PDP-8. Os comandos consistiam em palavras-chave seguidas por uma lista de parâmetros separados por espaços ou caracteres especiais. Se o CCP reconhecesse um comando interno, ele o executava. Caso contrário, tentava localizar o arquivo executável no disco ou na área do usuário (nas versões posteriores), carregá-lo e passar-lhe quaisquer parâmetros adicionais da linha de comando. Esses programas eram conhecidos como "programas transitórios". Após a conclusão, o CP/M recarregava a parte do CCP que havia sido sobrescrita pelos programas transitórios, disponibilizando assim mais memória para esses programas.

Às vezes, os comandos eram confusos. Por exemplo, a instrução para duplicar arquivos era PIP (Peripheral-Interchange-Program), o nome do antigo utilitário da DEC usado para essa finalidade. O formato dos parâmetros do programa não era padronizado; portanto, não havia uma "opção de caractere" única para distinguir as opções do nome do arquivo.

Comandos internos Os comandos internos estão integrados ao processador de comandos (CCP) e são carregados na RAM durante a inicialização do sistema.

ComandoDescrição DIR Lista os nomes dos arquivos na unidade de disco atual. unidade: Muda a unidade de disco (A: por padrão). ERA arquivo Elimina os arquivos especificados. TYPE arquivo Mostra o conteúdo de um arquivo na unidade de disco. arquivo Executa um arquivo .COM. SAVE n arquivo.com Salva o conteúdo da memória num arquivo. USER n Muda o espaço do usuário (0-15). REN novonome.nnn=nomeantigo.nnn Renomeia o arquivo especificado.

Comandos externos Os comandos externos (ou transitórios) são armazenados em disquetes (ou discos rígidos) para uso posterior.

ComandoDescrição ASM Carrega o assembler CP/M e monta o programa especificado a partir do disco. DDT Carrega o depurador do CP/M e inicia a execução. DUMP Descarrega o conteúdo de um arquivo en hexadecimal. ED Carrega e executa o editor de texto do CP/M. LOAD Carrega o arquivo no formato hexadecimal do código de máquina Intel e gera um arquivo executável que pode ser carregado na memória. Este programa se torna um novo comando, sob o CCP. MOVCPM Gera o sistema CP/M para um tamanho de RAM específico. PIP Carrega o programa Peripheral Interchange Program para operações de transferência entre periféricos e discos. STAT Exibe o espaço de armazenamento restante (em bytess) no disco atual, fornece informações estatísticas sobre determinados arquivos e exibe ou altera o mapeamento de dispositivos. SUBMIT Processa un arquivo de comandos em lote. SYSGEN Cria un disco de inicialização CP/M.

Sistema Operacional de Disco O Basic Disk Operating System (BDOS, ou Sistema Operacional de Disco Básico) fornece acesso a operações como abrir um arquivo, sair do console e imprimir. Os programas carregam os registradores do processador com o código de função para a operação e os endereços dos parâmetros ou buffers de memória, e solicitam um local fixo na memória. Como o endereço é o mesmo independentemente da quantidade de memória no sistema, os programas são executados da mesma maneira para qualquer tipo ou configuração de hardware.

Sistema Básico de Entrada/Saída miniatura|Caixa do CP/M 2.2 O Sistema Básico de Entrada/Saída (Basic Input Output System ou BIOS) fornece acesso às funções de baixo nível exigidas pelo sistema operacional. Essas funções incluem a leitura ou escrita de caracteres individuais no terminal do sistema e a leitura ou escrita de um setor de dados no disco. O BDOS lida com parte do buffer de dados do disco, mas antes do CP/M 3.0, ele assumia um tamanho de setor de disco fixo de 128 bytes, como o usado em disquetes de densidade única de 8 polegadas. Como a maioria dos formatos de disco de 5,25 polegadas utiliza setores grandes, o bloqueio e o desbloqueio — bem como o gerenciamento da área de memória do disco — eram realizados por meio de código específico na BIOS.

A personalização era necessária porque as opções de hardware não estavam limitadas pela compatibilidade com nenhum padrão amplamente conhecido. Por exemplo, alguns fabricantes utilizavam o terminal de computador como uma unidade independente, enquanto outras versões incorporavam um sistema de exibição de vídeo integrado. Portas seriais para impressoras e modems podiam utilizar diferentes tipos de chips UART, e os endereços das portas não eram fixos. Algumas máquinas utilizavam E/S mapeada em memória em vez do espaço de endereçamento de E/S do 8080. Todas essas variações de hardware permanecem ocultas dos demais módulos do sistema graças ao uso da BIOS, que utiliza pontos de entrada padronizados para os serviços necessários à execução do CP/M, como E/S de caracteres ou acesso a blocos de disco. Como o suporte para comunicação serial com um modem era muito rudimentar na BIOS ou podia estar completamente ausente, era prática comum que os programas CP/M que utilizavam modems tivessem uma sobreposição de usuário instalada, contendo todo o código necessário para acessar uma determinada porta serial na máquina.

Sistema de arquivos Os nomes dos arquivos consistiam em até oito caracteres, seguidos por um ponto e uma extensão de arquivo de até três caracteres (formato de nome de arquivo "8.3"). A extensão geralmente identificava o tipo de arquivo. Por exemplo, .COM indicava um arquivo binário executável e .TXT indicava um arquivo contendo texto ASCII.

Cada unidade de disco era identificada por uma letra. Normalmente, as duas unidades de disco eram identificadas como unidades A: e B:. Para se referir a um arquivo em uma unidade específica, a letra da unidade era precedida pelo nome do arquivo, separados por dois pontos, por exemplo, A:FILE.TXT. Sem a letra da unidade como prefixo, o padrão era usar os arquivos na unidade atual (por exemplo, um programa em execução na unidade B acessará arquivos na unidade B, a menos que os nomes dos arquivos sejam precedidos por uma letra de unidade).