CP/M (Control Program/Monitor o Control Program for Microcomputers: programa de control per a microordinadors) és un sistema operatiu de disc creat originàriament per Gary Kildall de Digital Research, Inc. per a microordinadors basats en els microprocessadors Intel 8080/85. Va estar inicialment limitat per a ús monousuari/monotasca en processadors de 8 bits i amb poc més de 64 KiB de memòria RAM, tot i que en versions posteriors es van afegir capacitats d'ús multiusuari/multitasca i van ser convertides per a UCPs de 16 bits.

La combinació de CP/M i ordinadors personals amb el bus S-100 iniciada amb l'Altair 8800 del MITS, va ser un dels primers estàndards industrials per a microordinadors, i era àmpliament utilitzada des de la dècada del 1970 fins a la meitat dels anys 1980. Reduint dràsticament la quantitat de programació necessària per instal·lar un aplicatiu en un ordinador d'un nou fabricant, el CP/M va incrementar tant el mercat de programari com de maquinari.

Model de maquinari Un sistema CP/M mínim de 8 bits sol contenir els següents components:

Un terminal d'ordinador amb el conjunt de caràcters ASCII Un microprocessador Intel 8080 (i posteriorment, 8085 o Z80) Almenys 16 KiB de RAM Un medi per a iniciar la càrrega del primer sector d'un disquet en la memòria Almenys una unitat de disc

L'únic maquinari suportat pel CP/M, en la versió distribuïda per la Digital Research, era l'Intel 8080 Development System. Fabricants de sistemes CP/M compatibles, adaptaven parts del sistema operatiu per a les seves pròpies combinacions de memòria instal·lada, unitats de disc i consola d'entrada. El CP/M també podia ser executat en sistemes basats en el processador Zilog Z80, ja que el Z80 era capaç d'executar codi 8080. Encara que el CP/M no fos capaç d'executar cap de les instruccions específiques del Z80, moltes aplicacions van ser programades per a màquines CP/M basades en el Z80.

En moltes màquines, el «bootstrap» era un programa mínim emmagatzemat en ROM; en d'altres, aquest programa havia de ser inserit directament en la memòria a través d'un panell frontal cada cop que carregava el sistema operatiu.

El CP/M usava un conjunt ASCII de 7 bits (128 caràcters). Els altres 128 caràcters possibles per un conjunt de 8 bits, no eren estandarditzats. Per exemple, un model Kaypro els utilitzava per a emmagatzemar caràcters de l'alfabet grec, mentre que les màquines Osborne, utilitzaven el vuitè bit per a indicar un caràcter subratllat. Els sistemes CP/M internacionals freqüentment usaven la norma ISO 646 per a adaptar conjunts de caràcters, substituint determinats caràcters ASCII per caràcters dels idiomes locals, en comptes d'afegir-los a més del límit de 7 bits.

Components del sistema operatiu miniatura|Mapa de memòria del CP/M En les versions de 8 bits, el nucli del CP/M estava dividit en tres components: el processador d'ordres de la consola (o CCP), el sistema operatiu de disc bàsic (o BDOS) i el sistema bàsic d'entrada/sortida (o BIOS). El CCP i BDOS eren els mateixos en totes les instal·lacions d'una revisió comuna del CP/M, però la part del BIOS sempre s'adaptava a un maquinari específic. Afegir memòria a un ordinador, per exemple, significava que el sistema CP/M s'havia de reinstal·lar. Un cop instal·lat, el sistema operatiu s'emmagatzemava en espais reservats al començament de qualsevol disc que s'utilitzaria per inicialitzar el sistema. En la inicialització, el carregador d'arrencada carregava el sistema operatiu a partir del disquet en la disquetera A:.

Pels estàndards moderns, el CP/M era primitiu a causa de les restriccions extremes a la grandària dels programes. Amb la versió 1.0 no es podia detectar un canvi de disquet. Si un usuari canviava discs sense que manualment rellegís el directori de fitxers, el sistema escriuria sobre el disc nou utilitzant la informació del directori del disc antic, destruint les dades emmagatzemades al nou disquet. A partir de les versions 1.1 o 1.2, aquest problema va ser reduït: si algú canviava discs sense llegir el directori del disc nou i intentava escriure-hi, el sistema operatiu indicaria l'avís d'error, evitant sobreescriure, però exigint una rearrencada (que no durava més que uns pocs segons, però que implicava la pèrdua de totes les dades en memòria).

La majoria de la complexitat del CP/M s'aïllava en el BDOS, i en més petita extensió, en el CCP. Significava que en portar el limitat nombre d'ordres simples del BIOS a una plataforma de maquinari en particular, el sistema operatiu sencer treballaria. Això significativament reduïa el temps de desenvolupament de programes necessari per donar suport a màquines noves, i era una de les raons principals per l'ús estès de CP/M. Avui, aquesta classe d'abstracció és comuna a la majoria dels sistemes operatius, però al temps del naixement del CP/M, els S.O. estaven pensats típicament per executar a només una plataforma de maquinari, i els sistemes multiplataforma es consideraven innecessaris.

Processador d'ordres de la consola El Processador d'Ordres de la Consola (Console Command Processor o CCP en anglès), accepta l'entrada des del teclat i transmet els resultats al terminal. El CP/M pot funcionar amb un terminal d'impressió o de vídeo. Totes les ordres del CP/M són escrites a l'intèrpret d'ordres. La consola mostra sovint en pantalla la lletra A>, per indicar la unitat de disc per defecte actual. Quan s'utilitza amb un terminal de vídeo, es mostra acompanyat d'un cursor parpellejant subministrat pel terminal que indica que el CCP espera les entrades de l'usuari.

Una interna del CCP, la lletra de la unitat seguida de dos punts, permet seleccionar la unitat per defecte. Per exemple, si s'escriu B: i es prem la tecla Enter en la línia d'ordres, es canviaria la unitat per defecte a la B, i el mateix intèrpret mostraria aquest canvi.

La línia d'ordres del CP/M va ser estandarditzada pels sistemes operatius de Digital Equipment, com el RT-11 pel PDP-11 i l'OS/8 pel PDP-8. Les ordres van prendre la forma de paraules clau seguides d'una llista de paràmetres separats per espais o caràcters especials. Si el CCP reconeix una ordre interna, la duu a terme. En cas contrari, tracta de trobar el fitxer executable al disc o a l'espai d'usuari (en versions posteriors), per carregar-lo i passar-li tots els paràmetres addicionals de la línia d'ordres. Aquests programes foren anomenats programes transitoris (o "transient" en anglès). En acabar, el CP/M carrega de nou la part del CCP que havia estat sobreescrita pels programes transitoris, cosa que permet una major memòria per aquests programes.

Les ordres eren de vegades confuses. Per exemple, la instrucció per duplicar fitxers era PIP (Programa d'Intercanvi entre Perifèrics o en anglès Peripheral-Interchange-Program), el nom de l'antiga utilitat DEC utilitzada per aquest propòsit. El format dels paràmetres del programa no es va estandarditzar, de manera que no hi havia una única "opció de caràcter" que diferenciàs les opcions del nom del fitxer.

Ordres internes Les ordres internes són integrades al processador d'ordres (CCP) i es carreguen a la memòria RAM durant la inicialització del sistema.

OrdreDescripció DIR Llista els noms de fitxers a la unitat de disc actual. unitat: Canvia la unitat de disc (A: per defecte). ERA fitxer Esborra els fitxers especificats. TYPE fitxer Mostra el contingut d'un fitxer a la unitat de disc. fitxer Executa un fitxer .COM. SAVE n fitxer.com Guarda el contingut de la memòria en un fitxer. USER n Canvia l'espai d'usuari (0-15). REN nounom.nnn=nomvell.nnn Canvia el nom del fitxer especificat.

Ordres externes Les ordres externes (o transitòries) són emmagatzemades en fitxers a les unitats de disc (o disc dur) per a la utilització posterior. OrdreDescripció ASM Fa la càrrega de l'assemblador del CP/M i munta el programa especificat des del disc. DDT Fa la càrrega del depurador del CP/M i comença l'execució. DUMP Bolca el contingut d'un fitxer en hexadecimal. ED Carrega i executa l'editor de text del CP/M. LOAD Carrega el fitxer en format de codi màquina Intel HEX i produeix un fitxer executable que pot ser carregat en la memòria. Aquest programa es converteix en un nou ordre sota el CCP. MOVCPM Regenera el sistema CP/M per a una mida de memòria RAM específica. PIP Fa la càrrega del programa Peripheral Interchange Program per operacions de transferència entre perifèrics i discs. STAT Mostra l'espai d'emmagatzematge restant (en bytes) del disc actual, ofereix informació estadística sobre determinats fitxers, i mostra o altera l'assignació de dispositius. SUBMIT Processa un fitxer d'ordres de tractament per lots. SYSGEN Crea un disc d'arrencada CP/M.

Sistema operatiu de disc El sistema operatiu bàsic de disc (Basic Disk Operating System o BDOS en anglès) proporciona accés a operacions com obrir un fitxer, la sortida de la consola o la impressió. Els programes carreguen els registres del processador amb un codi de funció per a l'operació i les adreces dels paràmetres o buffers de memòria, i demanen una ubicació fixa en la memòria. Atès que l'adreça és la mateixa independentment de la quantitat de memòria en el sistema, els programes s'executen de la mateixa manera per a qualsevol tipus o configuració de maquinari.

Sistema bàsic d'entrada/sortida El sistema bàsic d'entrada/sortida (Basic Input Output System o BIOS en anglès), proporciona accés a les funcions de nivell més baix requerides pel sistema operatiu. S'inclouen la lectura o l'escriptura de caràcters individuals a la terminal del sistema i llegir o escriure un sector de dades del disc. El BDOS controla part de la memòria intermèdia de les dades des del disc, però anteriorment al CP/M 3.0, se suposa una mida de sector de disc fixat en 128 Bytes, com el que s'utilitza en els disquets de 8 polzades de densitat individual. Atès que la majoria de formats de disc de 5,25 polzades utilitzen grans sectors, el bloqueig i el desbloqueig com també la gestió d'una àrea de memòria d'un disc ho realitzava un model de codi específic a la BIOS.

La personalització era necessària perquè les opcions del maquinari no es van veure limitades per la compatibilitat amb qualsevol estàndard famós. Per exemple, alguns fabricants utilitzaven el terminal d'ordinador independentment, mentre que altres versions incorporaven un sistema integrat de visualització de vídeo. Els ports sèrie per impressores i mòdems poden utilitzar diferents tipus de xips UART, i les adreces dels ports no eren fixos. Algunes màquines utilitzen memòria mapejada d'E/S en lloc de l'espai de direccions d'E/S del 8080. Totes aquestes variacions en el maquinari s'oculten en altres mòduls del sistema mitjançant l'ús de la BIOS, que s'utilitza els punts d'entrada estàndard per als serveis necessaris per executar el CP/M com un caràcter d'E/S o l'accés a un bloc de disc. Com que el suport a la comunicació serial a un mòdem era molt rudimentari en la BIOS o pot haver estat absent del tot, era una pràctica comuna per a programes CP/M que utilitzen mòdems amb una superposició d'usuari instal·lada que conté tot el codi necessari per accedir a un determinat port sèrie de la màquina.

Sistema de fitxers miniatura|Captura de pantalla de CP/M Els noms dels fitxers constaven de fins a vuit caràcters, seguits d'un punt i una extensió de nom de fitxer de fins a tres caràcters (format «8.3» de noms de fitxer). L'extensió generalment identificava el tipus de fitxer. Per exemple, .COM indicava un fitxer binari executable, i .TXT indicava un fitxer que contenia text ASCII.