CP/M
CP/M | |
![]() | |
Základné informácie | |
---|---|
Vývojár | Gary Kildall, Digital Research, Inc. |
Rodina OS | CP/M |
Programovací jazyk | PL/M |
Prvá verzia | 1974 (pred 50 rokmi) |
Posledná stabilná verzia | 3.1 / 1982 (pred 42 rokmi) |
Podporované platformy | Intel 8080, Intel 8085, Zilog Z80, Intel 8086, Motorola 68000 |
Jadro | monolitické |
Užívateľské rozhranie | príkazový riadok |
Licencia | pôvodne proprietárna, teraz pod licenciou podobnou BSD |
Stav vývoja | historický |
Ďalšie odkazy | |
Web | digitalresearch.biz/CPM.HTM |
Commons | CP/M |
CP/M (z angl. Control Program/Monitor, neskôr Control Program for Microcomputers; v ČSSR a Poľsku klon CP/M 2.2 Mikros) bol dominantný jednopoužívateľský jednoúlohový operačný systém, vytvorený pôvodne pre mikropočítače s 8-bitovými mikroprocesormi Intel 8080. Vyvinul ho v roku 1974 Gary Kildall, zakladateľ spoločnosti Digital Research, v tom čase pracujúci ako konzultant pre Intel.[1] Neskôr vznikli aj jeho rozšírenia pre viac ako 64 kilobajtov pamäte, viacpoužívateľské varianty aj varianty pre 16-bitové procesory.
Systém CP/M a počítače so zbernicou S-100 vyvinuté po vzore počítača Altair 8800 predstavovali raný priemyselný štandard mikropočítačov a táto platforma bola od konca 70. rokov do polovice 80. rokov 20. storočia dodávaná rôznymi výrobcami mikropočítačov. Po neúspechu úvodných rokovaní IBM s Digital Research ohľadom nasadenia CP/M-86 pre pripravované IBM PC a vysokej cene ho v priebehu 80. rokov postupne nahradil systém MS-DOS, ktorý prevzal niektoré jeho črty.[2][3]
Dejiny
[upraviť | upraviť zdroj]![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Sanco_8001.jpg/220px-Sanco_8001.jpg)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/26/CPM-86.png/220px-CPM-86.png)
Autorom CP/M bol Gary Kildall (* 1942 – † 1994), ktorý začal systém vytvárať ako konzultant pre spoločnosť Intel. Základ systému vznikal súbežne so zavádzaním výroby mikroprocesora Intel 8080 (1974), odstraňujúceho niektoré obmedzenia staršieho Intel 8008 (zásobník mapovaný do operačnej pamäte nahradil plytký hardvérový zásobník, 16-bitový adresový priestor namiesto 14b umožnil priamo adresovať 64 KiB pamäte). 8080 bol jedným z prvých mikroprocesorov vhodných pre konštrukciu viacúčelových mikropočítačov, ktorých segment po jeho uvedení čakal obrovský rozmach. Intel samotný adaptoval pre 8080 svoj existujúci komerčný mikropočítač Intellec 8, pre ktorý Kildall CP/M vyvíjal.
Po nezhodách s Intelom pokračoval Kildall vo vývoji CP/M ďalej na vlastnú päsť. Prototyp systému schopný pracovať s radičom disketových jednotiek Digital Systems vzbudil pozitívny ohlas. Pretože ale medzitým rýchlo vznikalo množstvo rozličných mikropočítačových zostáv, rozdelil Kildall systém na časť technicky nezávislú a časť technicky závislú, ktorú ako jedinú bolo potrebné prispôsobiť hardvéru konkrétnej mikropočítačovej zostavy. Toto rozdelenie, umožňujúce rýchlu a efektívnu adaptáciu systému na nový hardvér označil Kildall za tajomstvo úspechu CP/M.[4] Prvá zverejnená verzia systému CP/M bola verzia 1.3 (1976)[5], verzia 1.4 (1978)[5] už dokázala pracovať s radičom disketových jednotiek IBM.[6]
Verzia 2.2 (1979)[5] potom v technicky závislej časti obsahovala tabuľky vlastností pevných diskov. Táto verzia bola najrozšírenejšou verziou v bývalom Česko-Slovensku, známa pod označením Mikros.[7][8] Varianty Mikrosu existovali napr. pre viaceré mikropočítače SMEP z VÚVT Žilina (SM 50/40, PP 03, 05, 06), SAPI 1, IQ 151, TNS, PMD 85 a jeho klony alebo východonemecký Robotron 1715.
Verzia 3.1 obsahovala podporu pre stránkovanú pamäť. Okrem štandardného variantu CP/M existovali aj varianty umožňujúce spúšťanie viacerých úloh (Concurrent CP/M), CP/M s možnosťou prístupu viacerých používateľov súčasne (MP/M) a variant umožňujúci využitie zdieľaných sieťových prostriedkov (CP/NET).
Minimálne technické vybavenie
[upraviť | upraviť zdroj]Minimálne požiadavky systému CP/M na hardvérové vybavenie boli nasledovné:
- mikroprocesor Intel 8080 (8085) alebo Zilog Z80
- najmenej 16 kilobajtov pamäte RAM začínajúcej od adresy 0
- aspoň jedna disketová jednotka
- možnosť zavedenia OS z prvého sektoru diskety
- terminál používajúci znakovú sadu ASCII
Originálny systém CP/M, ktorý predávala firma Digital Research používal mikroprocesor Intel 8080. Výrobcovia systémov kompatibilných s CP/M upravovali časti systému pre svoje vlastné kombinácie pamäte, diskových jednotiek, a terminálov. CP/M tiež bežal na systémoch s mikroprocesorom Zilog Z80, pretože inštrukčný súbor Z80 je rozšírením inštrukčného súboru 8080. Kým systém od Digital Research používal iba inštrukcie pre 8080, mnoho systémov pre Z80 používalo inštrukcie pre Z80, takže tieto programy na počítačoch s procesormi Intel nefungovali.
CP/M používal 7-bitovú znakovú sadu ASCII. Použitie kódov 128 – 255 nebolo štandardizované. Počítače Osborne ich používali pre podčiarknuté znaky, počítače Kaypro pre grécke znaky. Medzinárodné systémy CP/M obvykle používali normu ISO 646 pre lokalizované národné znakové sady, ktoré namiesto použitia kódov 128 – 255 nahrádzajú niektoré ASCII znaky národnými znakmi.
Štruktúra operačného systému
[upraviť | upraviť zdroj]![](http://upload.wikimedia.org/wikipedia/commons/thumb/1/12/CP%E2%81%84M_Ad%2C_Dec_11%2C_1978.png/220px-CP%E2%81%84M_Ad%2C_Dec_11%2C_1978.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/03/CP%E2%81%84M_Ad%2C_InfoWorld%2C_November_29%2C_1982.jpg/220px-CP%E2%81%84M_Ad%2C_InfoWorld%2C_November_29%2C_1982.jpg)
Operačný systém CP/M sa skladá z troch základných súčastí:
- Basic Input/Output System – BIOS
- Basic Disk Operating System – BDOS
- Console Command Processor – CCP
BIOS a BDOS boli rezidentné – trvalo zavedené do pamäte, zatiaľ čo CCP mohol byť prepísaný spúšťaným programom. Pokiaľ k tomu došlo, bol CCP po ukončení programu znovu načítaný z disku. Systém bol dodávaný aj s niekoľkými pomocnými programami, ktoré boli uložené ako súbory s príponou .COM na disku.
Basic Input/Output System
[upraviť | upraviť zdroj]Modul BIOS obsahoval podprogramy pre obsluhu vstupných a výstupných zariadení, ako napríklad funkcie pre čítanie znaku z klávesnice, výpis znaku na obrazovku, čítanie sektora z diskety a zápis sektora na disketu. Táto časť bola závislá na technickom vybavení konkrétneho typu počítača.
Basic Disk Operating System
[upraviť | upraviť zdroj]Modul BDOS implementoval systém súborov a abstrakcie pre vstupné a výstupné operácie s využitím funkcií poskytovaných modulom BIOS. BDOS, CCP a štandardné príkazy boli (v ideálnom prípade) nezávislé na technickom vybavení. Pre obmedzené adresovacie možnosti použitých procesorov však bolo nutné preinštalovať systém pri zmene veľkosti operačnej pamäte. Nainštalovaný systém (BIOS, BDOS a CCP) bol uložený vo vyhradených oblastiach na systémovom disku, odkiaľ ho po zapnutí počítača zavádzač systému (spravidla uložený v pamäti ROM) načítal z diskety v prvej mechanike.
V porovnaní s modernými operačnými systémami bol CP/M veľmi primitívny, najmä kvôli veľmi obmedzenému rozsahu operačnej pamäte. Vo verzii 1.0 nevedel detegovať, že používateľ vymenil disketu, takže mohlo ľahko dôjsť k prepísaniu dát na diskete. Vo verzii 1.1 a 1.2 spôsobil pokus o zápis na vymenenú disketu kritickú chybu a bolo nutné reštartovať systém, takže došlo k strate dát, ktoré chcel používateľ uložiť.
Najzložitejšia časť CP/M bola izolovaná v BDOS, a v menšej miere v CCP a jednotlivých príkazoch. Pri prenose systému na nový hardvér stačilo prepísať iba relatívne jednoduché hardvérovo závislé funkcie v BIOSe, čo významne skracovalo dobu potrebnú pre prenos systému na nový hardvér a prispelo k veľkému rozšíreniu systému.
Console Command Processor
[upraviť | upraviť zdroj]Console Command Processor (CCP) slúži ako interpreter príkazov (shell) a poskytuje používateľské rozhranie systému – príkazový riadok. Zobrazuje písmeno aktuálnej diskovej jednotky a znak „väčší ako“ (napríklad A>) ako výzvu systému, načítava príkazy zadávané používateľom na klávesnici, buď ich priamo vykonáva alebo na ich vykonanie spustí dočasne zavedený program a zobrazuje výsledky na termináli. Ako terminál sa používal buď elektrický písací stroj alebo obrazovkový displej.
Interné príkazy vykonávané priamo programom CCP:
Príkaz | Použitie |
---|---|
A: | zmení aktuálnu diskovú jednotku |
ERA | vymaže súbor |
DIR | vypíše obsah adresára |
REN | premenuje súbor |
SAVE | uloží zadaný počet stránok (256 bajtov) pamäte od adresy 0100h do súboru |
TYPE | vypíše obsah súboru na obrazovku |
Externé príkazy dostupné v CP/M ako samostatne zavádzané programy:[9]
Príkaz | Použitie |
---|---|
ASM | preloží program v jazyku symbolických inštrukcií do strojového kódu |
DDT | spustí ladiaci program (debugger) |
DUMP | vypíše obsah súboru v hexadecimálnom formáte |
ED | textový editor |
LOAD | načíta súbor vo formáte kódu počítača HEX a vytvorí spustiteľný súbor, ktorý možno načítať do pamäte |
MOVCPM | prispôsobí systém CP/M pre konkrétnu veľkosť operačnej pamäte |
PIP | kopíruje súbory medzi diskami a zariadeniami (Peripheral Interchange Program) |
STAT | zobrazí voľné miesto (v bajtoch) na aktuálnom disku, poskytuje štatistické informácie o súboroch a zobrazí alebo zmení pridelenie zariadení |
SUBMIT | spustí dávkový súbor |
SYSGEN | vytvorí zavádzací disk systému CP/M |
Súborový systém
[upraviť | upraviť zdroj]Každá disková jednotka bola identifikovaná písmenom a dvojbodkou (A:, B:, atď.).
CP/M nepodporoval podadresáre. Názvy súborov mohli mať maximálne 8 znakov nasledovaných bodkou a max. 3 znaky prípony. Prípona sa používala pre určenie typu súboru. Programy mali príponu .COM a textové súbory .TXT. Plný názov súboru mohol byť napríklad A:CCP.COM alebo A:README00.TXT. Tento formát bol bez zmeny prevzatý do operačného systému MS-DOS resp. PC-DOS. Vo verzii MS-DOS/PC-DOS 2.0 bol potom doplnený podporou adresárov.
Veľkosť súboru bola udržiavaná ako počet 128-bajtových záznamov (zodpovedajúcich veľkosti sektorov na osempalcových disketách). Neexistencia presnej dĺžky súborov v bajtoch sa obchádzala v textových súboroch použitím znaku konca súboru (ASCII SUB, hexadecimálne 1A, Control-Z). Pomocou Ctrl+Z bolo možné docieliť aj skrátenie súboru.
Udržiavanie časov modifikácie súboru bolo podporované len v niektorých neskorších variantoch CP/M.
Chýbajúcu adresárovú štruktúru obchádzala CP/M verzia 2.2 pomocou až 16 používateľských oblastí na disku. Pre prepínanie medzi používateľmi slúžil príkaz USER x, kde x je číslo 0 až 15.
Organizácia pamäte
[upraviť | upraviť zdroj]Rozdelenie operačnej pamäte na typickom CP/M systéme so 64 KiB RAM (reálne veľkosti rezidentných modulov BIOS a BDOS sa môžu mierne líšiť podľa platformy a verzie CP/M):
0000h | SPA | komunikačná zóna (256 B)
|
0100h | TPA | zóna programov (56,75 KiB)
|
CCP | ||
E400h | BDOS | rezidentná zóna (7 KiB)
|
F200h | BIOS | |
FFFFh |
System Parameter Area
[upraviť | upraviť zdroj]Oblasť prvých 256 bajtov pamäte od adresy 0000h sa nazývala System Parameter Area (SPA) a bola vyhradená na údajové štruktúry pre komunikáciu medzi operačným systémom a aplikačným programom, stavové údaje a vyrovnávaciu pamäť (buffer).[10]
Transient Program Area
[upraviť | upraviť zdroj]Oblasť pamäte od adresy 256 (hexadecimálne 0100h) a začiatkom modulu BDOS sa nazývala Transient Program Area (TPA) a používa sa pre zavádzanie aplikačných programov. Procesory Z80 a 8080 môžu adresovať 64 kilobajtov pamäte, nie na všetkých počítačoch však bola pamäť tejto veľkosti k dispozícii. Niektoré počítače tiež majú v adresovom priestore ďalšie pamäte ako BIOS ROM, alebo videopamäť. V dôsledku toho mali rôzne počítače rôzne veľkú oblasť TPA. Niektoré neskoršie počítače mali viac ako 64 KiB operačnej pamäte a používali techniku prepínanie stránok pamäte. CP/M 3.0 umožňoval, aby v stránkovanej časti pamäte boli aj niektoré časti BDOSu.
Požiadavky operačného systému
[upraviť | upraviť zdroj]![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/db/EPSON_PX-8_-_1.jpg/220px-EPSON_PX-8_-_1.jpg)
Operačný systém CP/M vyžadoval pamäť RAM už od adresy 0000h. Počítače, ktoré neboli navrhované pre spúšťanie operačného systému CP/M mali väčšinou v týchto miestach pamäť ROM a boli tak nutné úpravy. Pre textový výstup bolo požadovaných 80 znakov na riadok. Pri počítačoch, ktoré mali štandardne len 40 znakov na riadok, sa toto riešilo vlastnými ovládačmi umožňujúci zobrazovať písmo s polovičnou šírkou znakov. Špecifické riešenie bolo použité pri CP/M pre ZX Spectrum +3. Keďže počítače ZX Spectrum podporovali nanajvýš 51 znakov na riadok (monochromaticky; farebne len 32), riešilo sa zobrazovanie 80 znakov simulovaným 80-znakovým režimom s dvoma prekrývajúcimi sa 51-znakovými pohľadmi (+3 disponoval dvoma prepínateľnými videopamäťami).[11] Keďže toto riešenie obmedzovalo čítanie súvislého textu, nebolo aktivované automaticky, ale pomocou príkazu. Klávesmi potom bolo možné prepínať medzi časťami obrazovky.
Jeden zo spôsobov, ako zabezpečiť pamäť RAM od adresy 0000h, je navrhnúť počítač tak, aby obsahoval v celom adresnom priestore pamäť RAM. Pretože ale taký počítač sám o sebe nie je možné spustiť, je nutná buď prepínateľná stránka pamäte od 0000h (implicitne po resete namapovaná ROM, neskôr softvérovo nahradená RAM stránkou) alebo po spustení počítača dočasne odpojiť procesor od zbernice a operačný systém CP/M nahrať do pamäte z vonkajšieho pamäťového média prostredníctvom pomocného procesora.[12]
Hardvérové architektúry
[upraviť | upraviť zdroj]Existovalo niekoľko vzájomne nekompatibilných architektúr počítačov (ZX Spectrum, Sharp, Atari, Amstrad-Schneider), kedy každá architektúra mala inak ovládaný hardvér (klávesnica, joysticky, videopamäť), inú organizáciu pamäte (umiestnenie pamäte RAM a ROM v adresovom priestore procesora, pripájanie pamäte väčšieho rozsahu než je adresový priestor procesora a pod.) a nekompatibilné periférie. Nekompatibilita periférií nebola len medzi rôznymi architektúrami, ale aj v rámci jednej architektúry. Napr. pre počítače ZX Spectrum existovalo viacero rôznych disketových systémov (Beta Disk Interface, Disciple, +D, Opus Discovery, Wafadrive, systém použitý v počítačoch ZX Spectrum +3, Didaktik 40/80, Dataputer, Timex FDD3000, Kempston Disc Interface, Byte Drive 500 a ďalšie). Operačný systém CP/M potom umožňoval písať programy použiteľné na rôznych architektúrach a v spojení s rôznymi perifériami.
Samozrejme existovali aj iné procesory, napr. MOS Technology 6510 použitý v Commodore 64. Pre tieto procesory operačný systém CP/M neexistoval, preto Commodore 128 obsahoval dva procesory: MOS Technology 8502 (novšia verzia 6510, pre režimy C64 a C128) a Zilog Z80 (pre režim CP/M). Pre počítače Apple II, založené na procesore MOS Technology 6502, existovala špeciálna karta pre prevádzku operačného systému CP/M s procesorom Zilog Z80.
Pamäťové médiá
[upraviť | upraviť zdroj]CP/M dokázal obslúžiť až 16 pripojených externých pamäťových jednotiek (disketové jednotky, pevné disky, RAM disky). Jednotky boli označené písmenami A: až P:. Médiá mali len koreňový adresár. Aby bola možná určitá štruktúrovanosť ukladaných údajov, bolo možné súbory ukladať pod číslami používateľov 0 – 15 (akoby na jednom médiu existovalo 16 koreňových adresárov a v každom boli uložené iné súbory). Bolo možné používať médiá až do veľkosti 32 MiB, pričom veľkosť súboru mohla byť až 16 MiB (verzia CP/M pre ZX Spectrum +3 mohla používať médiá až do veľkosti 16 MiB, pričom veľkosť súboru mohla byť až 8 MiB), čo v tom čase znamenalo ešte dostatočnú rezervu, keďže kapacita diskiet bola obvykle 360 alebo 720 KiB (dvojitá hustota, Double Density, DD), resp. 1,2 alebo 1,4 MiB pri použití záznamu s vysokou hustotou (High Density, HD). Existovala aj verzia CP/M pracujúca so ZX Microdrive.[13][14]
Aplikácie
[upraviť | upraviť zdroj]![](http://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Wordstar_4_CPM.jpg/220px-Wordstar_4_CPM.jpg)
Medzi známe aplikačné programy, vyvinuté pre CP/M, patria napr.:
- WordStar – jeden z prvých textových procesorov pre mikropočítače
- VisiCalc, SuperCalc a Multiplan – tabuľkové procesory
- dBase – populárny databázový program
- AutoCAD – CAD aplikácia od spoločnosti Autodesk
- viacero interpreterov a prekladačov dobovo rozšírených programovacích jazykov ako napr. COBOL, Fortran, BASIC, Turbo Pascal alebo C
- viacero hier, prevažne textovo orientovaných (Adventure, Star Trek, Zork), prípadne s ASCII pseudografikou (Aliens, CatChum, Ladder, Star Trader)
Referencie
[upraviť | upraviť zdroj]- ↑ Kildall 1994, s. 51.
- ↑ MALÝ, Martin. Proč vyhrál MS-DOS: rozhodl trh, ne kvalita [online]. root.cz, 2011-06-06, [cit. 2020-11-27]. Dostupné online.
- ↑ CP/M. In: Encyclopaedia Beliana [online]. Bratislava: Slovenská akadémia vied, [cit. 2020-11-27]. Dostupné online.
- ↑ Kildall 1994, s. 60.
- ↑ a b c Early Digital Research CP/M Source Code [online]. computerhistory.org, 2014-10-01, [cit. 2020-11-29]. Dostupné online.
- ↑ LAMAČ, Jiří. Operační systém CP/M v2.2 : Implementace na Sharp MZ-800. Praha : [s.n.], 1989. Dostupné online. S. 6.
- ↑ Bendíček 1986.
- ↑ MIKROS na PMD 85 [online]. pmd85.borik.net, [cit. 2020-11-28]. Dostupné online.
- ↑ CP/M Operating System Manual [online]. 3. vyd. Pacific Grove, California: Digital Research, [cit. 2019-01-18]. Dostupné online.
- ↑ Miller 1983, s. 3.
- ↑ CP/M Emancipation. Crash : ZX Spectrum (Ludlow: Newsfield Publications), jún 1988, č. 53, s. 64 – 65. Dostupné online [cit. 2020-11-28].
- ↑ RYVES, Ben. Combining a Z80 and an ATmega644P to boot CP/M [online]. benryves.com, 2010-06-14, [cit. 2020-11-28]. Dostupné online.
- ↑ VANĚK, Jakub; MECA, Daniel. CP/M na ZX Spectrum. Amatérské radio (Praha: Naše vojsko), 1988, roč. XXXVII, čís. 9, s. 337 – 339. Dostupné online.
- ↑ LAMAČ, Jiří; MECA, Daniel. Implementace CP/M na ZX Spectrum. Amatérské radio (Praha: Naše vojsko), 1988, roč. XXXVII, čís. 9, s. 339 – 341. Dostupné online.
Literatúra
[upraviť | upraviť zdroj]- MILLER, Alan R.. Mastering CP/M. Berkeley : Sybex, 1983. 398 s. Dostupné online. ISBN 978-0-89588-068-0.
- BENDÍČEK, Josef. MIKROS (CP/M 2.2). Amatérské radio (Praha: Naše vojsko), 1986, roč. XXXV, čís. 10 – 12/1986, 1/1987, s. 383 – 384, 423 – 424, 463 – 464, 23 – 24. Dostupné online [cit. 2020-11-28]. Archivované 2020-12-06 z originálu.
- KILDALL, Gary. Computer Connections: People, Places, and Events in the Evolution of the Personal Computer Industry. Mountain View : Computer History Museum, 1994. Dostupné online.
- KVAKSOFT. Operační systém CP/M poprvé. ZX Magazín, 1995, čís. 1/95, s. 23 – 24. Dostupné online. ISSN 1210-4833.
- KVAKSOFT. Operační systém CP/M podruhé. ZX Magazín, 1995, čís. 2/95, s. 22 – 25. Dostupné online. ISSN 1210-4833.
- ŽABENSKÝ, Petr. Operační systém CP/M potřetí. ZX Magazín, 1996, čís. 1/96, s. 26 – 27. Dostupné online. ISSN 1210-4833.
- KVAKSOFT. CP/M díl čtvrtý. ZX Magazín, 1998, čís. 3 / 98, s. 14 – 16. Dostupné online.
- ŽABENSKÝ, Petr. Operační systém CP/M popáté. ZX Magazín, 1999, čís. 4/98 – 1/99, s. 14 – 15. Dostupné online.
Iné projekty
[upraviť | upraviť zdroj]Commons ponúka multimediálne súbory na tému CP/M
Externé odkazy
[upraviť | upraviť zdroj]- Oficiálna stránka CP/M na webe Digital Research
- CP/M Main Page
- CP/M Internals na webe Obsolescence Guaranteed
- The Unofficial CP/M Web site (vrátane zdrojových kódov)
- Uvoľnený zdrojový kód CP/M
- ASM80 – online krížový assembler a IDE pre 8080, 8085, Z80 a 6502, vrátane emulátora CP/M
- Z88DK – krížový prekladač jazyka C pre množstvo platforiem založených na 8080, 8085 a Z80, vrátane CP/M
Zdroj
[upraviť | upraviť zdroj]Tento článok je čiastočný alebo úplný preklad článku CP/M na českej Wikipédii.