miniatura|Captura de pantalla de CP/M 2.2, executándose nun computador «Sanco 8001». Directorio de disquete. CP/M (Control Program/Monitor ou Control Program for Microcomputers: «programa de control para microordenadores») é un sistema operativo de disco creado orixinalmente por Gary Kildall de Digital Research, Inc. para microordenadores baseadas nos microprocesadores Intel 8080/85. Inicialmente limitábase ao uso dun só usuario/tarefa en procesadores de 8 bits e con pouco máis de 64 KB de RAM, aínda que versións posteriores engadiron capacidades multiusuario/multitarefa e foron portadas a CPUs de 16 bits.
A combinación de CP/M e ordenadores persoais co bus S-100, iniciada co MITS Altair 8800, foi un dos primeiros estándares da industria para microordenadores e utilizouse amplamente desde a década de 1970 ata mediados da de 1980. Ao reducir drasticamente a cantidade de programación necesaria para instalar unha aplicación no ordenador dun novo fabricante, CP/M aumentou tanto os mercados de software como de hardware.
Modelo de hardware Un sistema CP/M de 8 bits, como mínimo adoita conter os seguintes compoñentes:
Un terminal de ordenador co conxunto de caracteres ASCII Un microprocesador Intel 8080 (e posterior, 8085 ou Z80) Polo menos 16 KB de RAM Un medio para iniciar a carga do primeiro sector dun disquete na memoria Polo menos unha unidade de disco
O único hardware compatible con CP/M, na versión distribuída por Digital Research, era o Intel 8080 Development System («Sistema de desenvolvemento Intel 8080»). Os fabricantes de sistemas compatibles con CP/M adaptaron partes do sistema operativo para as súas propias combinacións de memoria instalada, unidades de disco e consola de entrada. O CP/M tamén podía executarse en sistemas baseados no procesador Zilog Z80, xa que o Z80 era capaz de executar código 8080. Aínda que CP/M non era capaz de executar ningunha das instrucións específicas do Z80, moitas aplicacións foron programadas para máquinas CP/M baseadas no Z80.
En moitas máquinas, o bootstrap era un programa mínimo almacenado na ROM; noutras, este programa tiña que inserirse directamente na memoria a través dun panel frontal cada vez que se cargaba o sistema operativo.
O CP/M empregaba un conxunto ASCII de 7 bits (128 caracteres). Os outros 128 caracteres posibles para un conxunto de 8 bits non estaban estandarizados. Por exemplo, un modelo Kaypro utilizábaos para almacenar caracteres do alfabeto grego, mentres que as máquinas Osborne utilizaban o oitavo bit para indicar un carácter de subliñado. Os sistemas internacionais CP/M empregaban con frecuencia o estándar ISO 646 para adaptar conxuntos de caracteres, substituíndo certos caracteres ASCII por caracteres do idioma local, en lugar de engadilos máis alá do límite de 7 bits.
Compoñentes do sistema operativo Nas versións de 8 bits, o núcleo CP/M dividíase en tres compoñentes: o procesador de comandos da consola (ou CCP), o sistema operativo de disco básico (ou BDOS) e o sistema básico de entrada/saída (ou BIOS). O CCP e o BDOS eran iguais en todas as instalacións dunha revisión CP/M común, pero a parte da BIOS sempre se adaptou a un hardware específico. Engadir memoria a un ordenador, por exemplo, significaba que o sistema CP/M tiña que ser reinstalado. Unha vez instalado, o sistema operativo almacenábase en espazos reservados ao comezo de calquera disco que se utilizaría para arrincar o sistema. No arranque, o cargador de arranque carga o sistema operativo desde o disquete na unidade A:.
Segundo os estándares modernos, CP/M era primitivo debido ás restricións extremas no tamaño dos programas. Coa versión 1.0, non se puido detectar un cambio de disquete. Se un usuario cambiaba de disco sen reler manualmente o directorio de ficheiros, o sistema sobrescribiría o novo disco usando a información do directorio do disco antigo, destruíndo os datos almacenados no novo disquete. A partir das versións 1.1 ou 1.2, este problema reduciuse: se alguén cambiaba de disco sen ler o directorio do novo disco e tentaba escribir nel, o sistema operativo emitía o aviso de erro, evitando a sobreescritura, pero requirindo un reinicio (o que só tardaba uns segundos, pero implicaba a perda de todos os datos da memoria).
A maior parte da complexidade de CP/M estaba illada en BDOS, e en menor medida en CCP. Significaba que ao portar o número limitado de comandos simples da BIOS a unha plataforma de hardware particular, todo o sistema operativo funcionaría. Isto reduciu significativamente o tempo de desenvolvemento do programa necesario para soportar novas máquinas, e foi unha das principais razóns para o uso xeneralizado de CP/M. Hoxe, esta clase de abstracción é común á maioría dos sistemas operativos, pero no momento do nacemento de CP/M, os sistemas operativos estaban normalmente deseñados para executarse nunha soa plataforma de hardware, e os sistemas multiplataforma eran considerados innecesarios.
Procesador de comandos da consola O Console Command Processor (CCP, ou «Procesador de Comandos da Consola») acepta a entrada do teclado e transmite os resultados ao terminal. O CP/M pode funcionar cunha impresora ou un terminal de vídeo. Todos os comandos do CP/M están escritos no intérprete de comandos. A consola adoita mostrar a letra A> na pantalla para indicar a unidade de disco predeterminada actual. Cando se usa cun terminal de vídeo, móstrase acompañado dun cursor intermitente subministrado polo terminal que indica que o CCP está agardando a entrada do usuario.
Un comando interno do CCP, a letra da unidade seguida de dous puntos, permíteche seleccionar a unidade predeterminada. Por exemplo, se escribes B: e premes a tecla Intro na liña de comandos, a unidade predeterminada cambiaría a B e o propio intérprete mostraría este cambio.
A liña de comandos CP/M foi estandarizada polos sistemas operativos de Digital Equipment, como o RT-11 para o PDP-11 e OS/8 para o PDP-8. Os comandos adoptaban a forma de palabras clave seguidas dunha lista de parámetros separados por espazos ou caracteres especiais. Se o CCP recoñece un comando interno, execútao. En caso contrario, tenta atopar o ficheiro executábel no disco ou no espazo de usuario (en versións posteriores), cargalo e pasarlle calquera parámetro adicional da liña de comandos. Estes programas denominábanse programas transitorios (ou «transient» en inglés). Ao finalizar, CP/M recarga a parte do CCP que fora sobrescrita polos programas transitorios, o que permite ter máis memoria para estes programas.
Ás veces, os comandos eran confusos. Por exemplo, a instrución para duplicar ficheiros era PIP (Peripheral-Interchange-Program), o nome da antiga utilidade DEC empregada para este propósito. O formato dos parámetros do programa non estaba estandarizado, polo que non había unha única «opción de carácter» que diferenciase as opcións do nome do ficheiro.
Comandos internos Os comandos internos están integrados no procesador de comandos (CCP) e cárganse na RAM durante a inicialización do sistema.
ComandoDescrición DIR Lista os nomes dos ficheiros na unidade de disco actual. unidade: Cambia a unidade de disco (A: por defecto). ERA ficheiro Elimina os ficheiros especificados. TYPE ficheiro Mostra o contido dun ficheiro na unidade de disco. ficheiro Executa un ficheiro .COM. SAVE n ficheiro.com Garda o contido da memoria nun ficheiro. USER n Cambia o espazo do usuario (0-15). REN novonome.nnn=nomeantigo.nnn Renomea o ficheiro especificado.
Comandos externos Os comandos externos (ou transitorios) están almacenados en disquetes (ou discos ríxidos) para o seu uso posterior.
ComandoDescrición ASM Carga o ensamblador do CP/M e monta o programa especificado desde o disco. DDT Carga o depurador do CP/M e comeza a execución. DUMP Descarta o contido dun ficheiro en hexadecimal. ED Carga e executa o editor de texto CP/M. LOAD Carga o ficheiro en formato hexadecimal código máquina Intel e produce un ficheiro executable que se pode cargar na memoria. Este programa convértese nun novo comando baixo o CCP. MOVCPM Rexenera o sistema CP/M para un tamaño de RAM específico. PIP Carga o programa Peripheral Interchange Program para operacións de transferencia entre periféricos e discos. STAT Mostra o espazo de almacenamento restante (en bytes) no disco actual, proporciona información estatística sobre certos ficheiros e mostra ou altera a asignación de dispositivos. SUBMIT Procesa un ficheiro de comandos por lotes. SYSGEN Crea un disco de arranque CP/M.
Sistema operativo de disco O sistema operativo de disco básico (Basic Disk Operating System ou BDOS en inglés) proporciona acceso a operacións como abrir un ficheiro, saír da consola e imprimir. Os programas cargan os rexistros do procesador cun código de función para a operación e os enderezos dos parámetros ou búferes de memoria e solicitan unha localización fixa na memoria. Dado que o enderezo é o mesmo independentemente da cantidade de memoria no sistema, os programas execútanse do mesmo xeito para calquera tipo ou configuración de hardware.
Sistema básico de entrada/saída O sistema básico de entrada/saída (Basic Input Output System ou BIOS, en inglés) proporciona acceso ás funcións de nivel máis baixo que require o sistema operativo. Estas inclúen a ler ou escribir caracteres individuais no terminal do sistema e a ler ou escribir un sector de datos desde o disco. O BDOS controla parte do almacenamento en búfer dos datos do disco, pero antes do CP/M 3.0, asumía un tamaño de sector de disco fixo de 128 bytes, como o que se usa nos disquetes de densidade única de 8 polgadas. Dado que a maioría dos formatos de disco de 5,25 polgadas usan sectores grandes, o bloqueo e desbloqueo, así como a xestión da área de memoria dun disco, realizábanse mediante un modelo de código específico na BIOS.
A personalización era necesaria porque as opcións de hardware non estaban limitadas pola compatibilidade con ningún estándar famoso. Por exemplo, algúns fabricantes empregaban o terminal informático de forma independente, mentres que outras versións incorporaban un sistema integrado de visualización de vídeo. Os portos serie para impresoras e módems podían usar diferentes tipos de chips UART, e os enderezos dos portos non eran fixos. Algunhas máquinas usan memoria mapeada de E/S en lugar do espazo de enderezos de E/S do 8080. Todas estas variacións de hardware están ocultas noutros módulos do sistema mediante o uso da BIOS, que emprega puntos de entrada estándar para os servizos necesarios para executar CP/M, como a E/S de caracteres ou o acceso a bloques de disco. Debido a que o soporte para a comunicación serie a un módem era moi rudimentario na BIOS ou podía estar ausente por completo, era práctica común que os programas CP/M que usaban módems tivesen instalada unha superposición de usuario que contiña todo o código necesario para acceder a un porto serie particular da máquina.
Sistema de ficheiros miniatura|Disquete de usuario final CP/M 2.2. Os nomes dos ficheiros constaban de ata oito caracteres, seguidos dun punto e unha extensión de nome de ficheiro de ata tres caracteres (formato de nome de ficheiro «8.3»). A extensión adoita identificar o tipo de ficheiro. Por exemplo, .COM indicaba un ficheiro binario executable e .TXT indicaba un ficheiro que contén texto ASCII.
Cada unidade de disco identificábase cunha letra de unidade. Normalmente, as dúas unidades de disco identificáronse como unidades A: e B:. Para referirse a un ficheiro nunha unidade específica, a letra da unidade tiña como prefixo o nome do ficheiro, separado por dous puntos, por exemplo A:FILE.TXT. Sen a letra da unidade como prefixo, o estándar era utilizar ficheiros da unidade actual (por exemplo, un programa que se executa na unidade B accederá aos ficheiros da unidade B a menos que os nomes dos ficheiros estean precedidos dunha letra da unidade).