{"id":17927,"date":"2025-02-08T00:22:01","date_gmt":"2025-02-07T23:22:01","guid":{"rendered":"https:\/\/www.bernd-leitenberger.de\/blog\/?p=17927"},"modified":"2025-02-06T12:37:49","modified_gmt":"2025-02-06T11:37:49","slug":"die-technik-hinter-cpm-3","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/02\/08\/die-technik-hinter-cpm-3\/","title":{"rendered":"Die Technik hinter CP\/M (3)"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_17927\" class=\"pvc_stats all  \" data-element-id=\"17927\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Das ist der vorletzte von vier Teilen &uuml;ber das Innenleben von CP\/M. Erschienen sind:<\/p>\n<p><a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/02\/06\/die-technik-hinter-cpm\/\">Teil 1 behandelt den Aufbau des Speichers und des Dateisystems<\/a><\/p>\n<p><a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/02\/07\/die-technik-von-cpm-2\/\">Teil 2 behandelt den Aufbau einer Diskette und des Rechners, Bildschirm und Tastatur<\/a><\/p>\n<p>und sie lesen gerade:<\/p>\n<p><a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/02\/08\/die-technik-hinter-cpm-3\/\">Teil 3 behandelt die BDOS-Funktionen, den Kommandointerpreeter, User Befehl und die Ger&auml;te.<\/a><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg01.met.vgwort.de\/na\/9815531e1d89470ab8c03e5aa44372c1\" width=\"1\" height=\"1\" alt=\"\"\/><br \/>\nmorgen erscheint dann:<\/p>\n<p><a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/02\/09\/die-technik-hinter-cpm-4\/\">Teil 4:\u00a0 &Uuml;ber CP\/M 3, andere Versionen und warum es heute noch neue CP\/M Rechner gibt.<\/a><br \/>\n<!--more--><\/p>\n<h2 class=\"western\">Die BDOS Funktionen<\/h2>\n<p><span style=\"color: #000000;\">Die Kommunikation mit dem BDOS erfolgte mit dem Aufruf einer bestimmten Adresse (5). Als &Uuml;bergabeparameter gab es immer die Funktionsnummer im C-Register. Daten, die an BDOS &uuml;bergeben werden \u2013 im unteren Beispiel die Adresse eines auszugebenden Strings \u2013 werden im DE-Registerpaar als Adresse &uuml;bergeben, R&uuml;ckgabewerte nach Verlassen der Funktion stehen im HL-Registerpaar. Das folgende Beispiel ist das Hello-World Programm das nur diesen Text ausgibt. Es ist nur 25 Bytes lang, wobei es noch wenn ich aus Didaktischen Gr&uuml;nden nicht das Programmende durch einen Warmstart ausgel&ouml;st h&auml;tte, sondern nur einen Restart 0 nochmals 4 Bytes k&uuml;rzer sein k&ouml;nnte. Der Quelltext (auf dem PC geschrieben) ist dieser:<\/span><\/p>\n<p><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\">tpastart <\/span> <span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\">equ<\/span><span class=\"auto-style2\" style=\"font-size: xx-small;\"> <span style=\"color: #0000ff; font-family: DejaVu Sans Mono, serif;\">100<\/span><span style=\"color: #800000; font-family: DejaVu Sans Mono, serif;\">h<\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i>; Definition TPA Start<\/i><\/span><\/span><\/p>\n<p><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> bdos <\/span> <span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> equ<\/span> <span style=\"color: #0000ff; font-family: DejaVu Sans Mono, serif;\"> 5<\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif; font-size: xx-small;\"> <span class=\"auto-style3\" style=\"font-size: xx-small;\">; Definition BDOS Einsprungpunkt <\/span> <\/span><\/p>\n<p><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> conout <\/span> <span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> equ<\/span><span class=\"auto-style2\" style=\"font-size: xx-small;\"> <span style=\"color: #0000ff; font-family: DejaVu Sans Mono, serif;\"> 9<\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i>; Funktion 9 zum Ausgeben eines Strings auf dem Bildschirm<\/i><\/span><\/span><\/p>\n<p><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> wstart <\/span> <span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> equ<\/span> <span style=\"color: #0000ff; font-family: DejaVu Sans Mono, serif;\"> 0<\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif; font-size: xx-small;\"> <span class=\"auto-style3\" style=\"font-size: xx-small;\">; Laedt BDOS vom der Platte und beendet Programm<\/span><\/span><\/p>\n<p><span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> org<\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> tpastart<\/span><\/p>\n<p><span style=\"color: #ff0000; font-family: DejaVu Sans Mono, serif;\"> <b>mvi<\/b><\/span> <span class=\"auto-style2\" style=\"font-size: xx-small;\"> <span style=\"color: #800000; font-family: DejaVu Sans Mono, serif;\"> c<\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\">,conout <\/span><span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i> ; Funktion muss im C Register sein<\/i><\/span><\/span><\/p>\n<p><span style=\"color: #ff0000; font-family: DejaVu Sans Mono, serif;\"> <b>lxi<\/b><\/span> <span class=\"auto-style2\" style=\"font-size: xx-small;\"> <span style=\"color: #800000; font-family: DejaVu Sans Mono, serif;\"> d<\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\">,helloworld <\/span><span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i> ; Ausgabestring im DE Register<\/i><\/span><\/span><\/p>\n<p><span style=\"color: #ff0000; font-family: DejaVu Sans Mono, serif;\"> <b>call<\/b><\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> bdos <\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i> ; Ausgabe<\/i><\/span><\/p>\n<p><span style=\"color: #ff0000; font-family: DejaVu Sans Mono, serif;\"> <b>mvi<\/b><\/span> <span class=\"auto-style2\" style=\"font-size: xx-small;\"> <span style=\"color: #800000; font-family: DejaVu Sans Mono, serif;\"> c<\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\">,wstart<\/span><\/span><\/p>\n<p><span style=\"color: #ff0000; font-family: DejaVu Sans Mono, serif;\"> <b>call<\/b><\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> bdos <\/span> <span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i> ; Programmende (ein RST 0 h&auml;tte es auch getan)<\/i><\/span><\/p>\n<p><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> helloworld: <\/span><span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> db<\/span><span class=\"auto-style2\" style=\"font-size: xx-small;\"><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\"> &#8218;Hallo Welt!<\/span><span style=\"color: #0000ff; font-family: DejaVu Sans Mono, serif;\">$<\/span><span style=\"color: #000000; font-family: DejaVu Sans Mono, serif;\">&#8218; <\/span><span style=\"color: #008000; font-family: DejaVu Sans Mono, serif;\"><i> ; Zeichenkette terminiert mit Dollarzeichen<\/i><\/span><\/span><\/p>\n<p><span style=\"color: #008080; font-family: DejaVu Sans Mono, serif;\"> end<\/span><\/p>\n<p>Der Prozess der Erzeugung eines ausf&uuml;hrbaren Programms ist etwas lang. Zuerst habe ich den Quelltext vom PC auf das CP\/M System &uuml;bertragen, dann mit ASM &uuml;bersetzt wobei eine .HEX Datei entsteht. Der Befehl LOAD l&auml;dt dieses an die Startadresse und konvertiert es in eine .com Datei die man dann ausf&uuml;hren kann:<\/p>\n<p class=\"auto-style4\">A&gt;pcget bdos.asm<img loading=\"lazy\" decoding=\"async\" src=\"\/img\/ez9&szlig;0.png\" alt=\"CP\/M Ausgabe im Terminal\" width=\"800\" height=\"738\" \/><\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">Get a File from a host using XMODEM or XMODEM-1K on ASCI 1<\/span><\/span><\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">+++Note &#8211; Old file has been deleted+++<\/span><\/span><\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">Waiting for block # 07<\/span><\/span><\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">Transfer complete<\/span><\/span><\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">A&gt;asm bdos<\/span><\/span><\/p>\n<p class=\"auto-style4\">CP\/M ASSEMBLER &#8211; VER 2.0<\/p>\n<p class=\"auto-style4\">0119<\/p>\n<p class=\"auto-style4\">000H USE FACTOR<\/p>\n<p class=\"auto-style4\">END OF ASSEMBLY<\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">A&gt;load bdos<\/span><\/span><\/p>\n<p class=\"auto-style4\">FIRST ADDRESS 0100<\/p>\n<p class=\"auto-style4\">LAST ADDRESS 0118<\/p>\n<p class=\"auto-style4\">BYTES READ 0019<\/p>\n<p class=\"auto-style4\">RECORDS WRITTEN 01<\/p>\n<p><span class=\"auto-style4\"> <span class=\"auto-style2\" style=\"font-size: small;\">A&gt;bdos<\/span><\/span><\/p>\n<p class=\"auto-style4\">Hallo Welt!<\/p>\n<p class=\"auto-style4\">A&gt;<\/p>\n<p>Schon damals fragte ich mich, warum Gary Kildall das Dollarzeichen ($) als String-ende nahm. Eine Theorie die es gibt, ist das dies von seinen Erfahrungen mit DEC Gro&szlig;rechnern herr&uuml;hrte. Vieles von CP\/M hat er vom Betriebssystem DECSystem-10 einer PDP-30 &uuml;bernommen, so wie Laufwerksbuchstaben. Ich fand die Wahl f&uuml;r ein Betriebssystem, das zuerst einmal f&uuml;r US-Kunden gedacht war, nicht optimal. Drot kommt das Dollarzeichen dann doch oft in Texten vor. Idealerweise h&auml;tte man wohl ein nichtdruckbares Zeichen wie Nul (Code 0) oder End of File (Code 27) genommen. F&uuml;r den Fall das es ein eintippbares Zeichen sein musste, w&auml;ren mir andere selten genutzte eingefallen wie \u201e@\u201c, \u201e^\u201c oder \u201e`\u201c (Email wurde erst 10 Jahre nach CP\/M eingef&uuml;hrt, sodass der Klammeraffe @ damals kaum genutzt wurde). Alle diese Zeichen kommen sowohl in Programmiersprachen, wie auch US-Texten kaum vor.<\/p>\n<p>CP\/M bekam mit jeder Version neues BDOS Funktionen, beim popul&auml;ren CP\/M 2.2 waren es 41, wobei zwei aber gekennzeichnet waren mit \u201eNicht mehr verwenden\u201c. Die meisten Funktionen hatten mit der Verwaltung von Dateien, Disketten und Verzeichnissen zu tun. Dazu gab es Funktionen f&uuml;r die logischen Ger&auml;te Bildschirm, Tastatur, Drucker, Leser und Stanzer.<\/p>\n<h2 class=\"western\">Der Kommandointerpreter<\/h2>\n<p>Der CCP (Console Command Processor) war die Benutzerschnittstelle von CP\/M. Er war immer 2048 Bytes lang (alle CP\/M Programme hatten eine L&auml;nge von Vielfachem einer Page also 256 Bytes). Er verf&uuml;gte &uuml;ber nur wenige eingebaute Befehle:<\/p>\n<ul>\n<li>Dir zeigt das Verzeichnis oder einzelne Dateien an<\/li>\n<li>Type Gibt den Inhalt einer Textdatei auf dem Bildschirm aus<\/li>\n<li>ERA l&ouml;scht Dateien<\/li>\n<li>Ren benennt Dateien um<\/li>\n<li>User: wechselt den User-Bereich (siehe unten)<\/li>\n<\/ul>\n<ul>\n<li>Load L&auml;dt eine Hex Datei in de Speicher und speichert sie als ausf&uuml;hrbare com-Datei<\/li>\n<li>Save speichert einen Speicherauszug ab 100h in einer Datei<\/li>\n<\/ul>\n<p>Man konnte nur das letzte Zeichen oder die ganze Zeile bei der Eingabe l&ouml;schen, Cursorbewegungen in der Eingabezeile waren nicht m&ouml;glich. Gab man einen Dateinamen ein, der nicht den obigen Befehlen entsprach, so suchte der CCP nach einer Datei mit der Endung .com und lud sie in den Speicher und startete sie. Danach konnte der CCP, der unter dem BDOS lag, &uuml;berschrieben werden. Er wurde bei einem Warmstart (Laden des BDOS von der Diskette) automatisch wieder geladen. Das ergab 2 KByte mehr Speicher.<\/p>\n<h2 class=\"western\">Der User Befehl<\/h2>\n<p>Eine Besonderheit von CP\/M ist das User-Kommando. Es gab 16 User mit den Nummern 0 bis 15. Bei jeder Datei wurde gespeichert, welcher User sie anlegte. Warum dieses Konstrukt eingef&uuml;hrt wurde, ist mir ein R&auml;tsel. Vielleicht ist es eines der Dinge die Gar Kildall &uuml;bernahm \u2013 vieles an CP\/M wurde von den Betriebssystemen von DEC f&uuml;r Gro&szlig;rechner abgeschaut. Ich dachte auch eine Zeitlang, der Befehl stammte aus MP\/M \u2013 eine CP\/M Version f&uuml;r mehrere Nutzer, aber die kam erst heraus, als es das User Kommando schon gab.<\/p>\n<p>Bei einer gro&szlig;en Diskette k&ouml;nnen schon mal mehrere Hundert Dateien im Verzeichnis stehen. CP\/M speichert zudem alles in Gro&szlig;buchstaben, was das Lesen nicht erleichtert. Dann den &Uuml;berblick zu behalten ist schwer. Das mag eine Erkl&auml;rung f&uuml;r die User Bereiche gewesen sein. Aber man hatte das Konzept nicht richtig durchdacht, denn wenn man den User Bereich wechselte, sah man nicht nur die Dateien des aktuellen User Bereichs, nein, man konnte auch auf keine anderen Dateien in anderen User-Bereichen zugreifen. Wie aber kopiert man Dateien und Programme zwischen den Usern? Die L&ouml;sung war folgende:<\/p>\n<p><span style=\"font-family: Courier New, monospace;\">a&gt;PIP<\/span><\/p>\n<p><span style=\"font-family: Courier New, monospace;\">*^C<\/span><\/p>\n<p><span style=\"font-family: Courier New, monospace;\">A&gt;User 1<\/span><\/p>\n<p><span style=\"font-family: Courier New, monospace;\"><span class=\"auto-style2\" style=\"font-size: small;\"> A&gt;Save 28 pip.com<\/span><\/span><\/p>\n<p>Man startete das Programm PIP zum Kopieren von Dateien, das mit dem Parameter [Gnn] auch die Dateien von anderen Usern kopieren konnte, brach es ab, wechselte den User und speichere es \u2013 es war immer noch im Speicher &#8211; erneut ab. PIP existierte so zweimal einmal im User Bereich 0 und einmal in 1. Ich denke mit wenig mehr Aufwand h&auml;tte man es so machen k&ouml;nnen, das Dateien im Userbereich 0 immer von allen Usern ausgef&uuml;hrt werden k&ouml;nnen und ein Directory Befehl der auch Dateien eines anderen User-Bereichs anzeigt, w&auml;re auch nicht schlecht gewesen<\/p>\n<h2 class=\"western\">Ger&auml;te<\/h2>\n<p>Diskettenlaufwerke und Festplatten sprach man mit Buchstabe+Doppelpunkt an, also z.B. A:. Neben diesen 15 Laufwerken kannte CP\/M aber auch noch andere Ger&auml;te (Devices) wobei es unterschied zwischen logischen und physikalischen Ger&auml;ten. Ein logisches Ger&auml;t hatte eine feste Bezeichnung, aber der Benutzer konnte entscheiden, welches physikalische Ger&auml;t sich dahinter verbarg, das Geschah mit dem Programm STAT. Es gab vier logische Ger&auml;te: con: f&uuml;r die Konsole (Tastatur und Bildschirm), lst: f&uuml;r den Drucker und RDR: und PUN: f&uuml;r einen Papierstreifenleser\/stanzer (Lesen\/Schreiben getrennt) . Der Papierstreifenleser war nur in den Anfangszeiten von CP\/M als Ger&auml;t vorhanden und wurden z.B. mit einer seriellen Schnittstelle verbunden.<\/p>\n<p>Der Benutzer konnte dieses Systems der Ports, so hie&szlig;en sie technisch, auf bis zu 16 ausweiten, so trennte CP\/M 3.0 den Con: Port in zwei separate Ports f&uuml;r Eingabe und Ausgabe. Dazu war aber eine BIOS Anpassung n&ouml;tig. Die meisten CP\/M-Programme verwendeten daher nur die Standardports. Der Vorteil war, dass man so die physikalischen Ports den logischen Ports zuordnen konnte. Die Bildschirmausgabe eines Programms konnte auf den Drucker umgeleitet werden oder die Kommandoeingabe auf eine Batchdatei. Folgende physikalischen Ger&auml;te kannte CP\/M:<\/p>\n<p>&nbsp;<\/p>\n<table class=\"auto-style5\" cellspacing=\"1\" cellpadding=\"2\">\n<colgroup>\n<col width=\"57\" \/>\n<col width=\"558\" \/> <\/colgroup>\n<tbody>\n<tr>\n<th class=\"auto-style1\">Device<\/th>\n<th class=\"auto-style1\">Meaning<\/th>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">TTY:<\/td>\n<td class=\"auto-style1\">Teletype device (slow speed console)<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">CRT:<\/td>\n<td class=\"auto-style1\">Cathode ray tube device (high speed console)<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">BAT:<\/td>\n<td class=\"auto-style1\">Batch processing (console is current RDR:, output goes to current LST: device)<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UC1:<\/td>\n<td class=\"auto-style1\">User-defined console<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">PTR:<\/td>\n<td class=\"auto-style1\">Paper tape reader (high speed reader)<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UR1:<\/td>\n<td class=\"auto-style1\">User-defined reader #1<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UR2:<\/td>\n<td class=\"auto-style1\">User-defined reader #2<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">PTP:<\/td>\n<td class=\"auto-style1\">Paper tape punch (high speed punch)<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UP1:<\/td>\n<td class=\"auto-style1\">User-defined punch #1<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UP2:<\/td>\n<td class=\"auto-style1\">User-defined punch #2<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">LPT:<\/td>\n<td class=\"auto-style1\">Line printer<\/td>\n<\/tr>\n<tr>\n<td class=\"auto-style1\">UL1:<\/td>\n<td class=\"auto-style1\">User-defined list device #1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\"> <img decoding=\"async\" src=\"file:\/\/\/C:\/Users\/Admin\/Documents\/Websites\/bernd-leitenberger\/img\/circle-m-rechner.jpg\" alt=\"CP\/M Rechner heute\" width=\"33%\" height=\"33%\" \/><\/span>In der Praxis war nat&uuml;rlich wichtig, welche Hardware verbaut war. PTR und PTP wurden, als Bezeichnung von der UR-CP\/M Version &uuml;bernommen, aber wenige Jahre sp&auml;ter, als kein Papierstreifenleser\/-stanzer mehr im Einsatz war, z.B. der seriellen Schnittstelle zugeordnet. Die User Definied Ger&auml;te erforderten eine BIOS-Anpassung. TTY war trotz des Namens immer die Tastatur des Computers. Mittels Stat dev: konnte man die Belegung anzeigen:<\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">A&gt;stat dev:<\/span><\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">CON: is TTY:<\/span><\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">RDR: is PTR:<\/span><\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">PUN: is PTP:<\/span><\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">LST: is LPT:<\/span><\/p>\n<p align=\"left\">und so konnte man eine Belegung &auml;ndern:<\/p>\n<p align=\"left\"><span style=\"font-family: Courier New, monospace;\">A&gt;stat con:=crt:<\/span><\/p>\n<h2 class=\"western\">Vielfalt und riesige Programmauswahl<\/h2>\n<p>CP\/M erm&ouml;glichte zwei Dinge. Es war zum einen ein Standard und zum anderen lies es dem Hersteller Freiheiten. Es war ein Standard, weil jedes Programm das auf eine Anfangsadresse von 100H compiliert oder assembliert ist und nur die BDOS oder BIOS Funktionen nutzt auf jedem Rechner bei dem CP\/M l&auml;uft nutzbar ist.<\/p>\n<p>Ein Newcomer im Computerbereich hat &uuml;blicherweise das Problem, das wenn er ein eigenes Betriebssystem einsetzt es daf&uuml;r keine Software gibt, was sowohl f&uuml;r K&auml;ufer wie Softwareentwickler ein gro&szlig;es Manko ist. CP\/M machte Programme austauschbar. Ein Redakteur der Zeitschrift ct\u2019 schrieb, das <a href=\"https:\/\/www.bernd-leitenberger.de\/programme.shtml\">Wordstar<\/a> die <a href=\"https:\/\/www.bernd-leitenberger.de\/VisiCalc.shtml\">Killerapplikation<\/a> f&uuml;r CP\/M war. Damit konnte man Texte schreiben, &auml;hnlich wie sp&auml;ter unter Word f&uuml;r DOS &#8211; es war schwerer zu bedienen, aber die meisten Funktionen hatte es schon.<\/p>\n<p>Auf der anderen Seite machte CP\/M kaum Hardwarevorschriften \u2013 eigentlich nur den Prozessor. Es lief auf jedem 8080, <a href=\"https:\/\/www.bernd-leitenberger.de\/8085.shtml\">8085<\/a> oder Z80 Prozessor (sp&auml;ter w&uuml;rde man dies durch den HD64180, Z180 und EZ80 erg&auml;nzen). Als Extreme gab es Laptops mit CMOS-Stromspar CPUs und Rechner mit Z80B\/C mit 6 bis 8 MHZ Takt. Es gab Rechner mit einfachem Textbildschirm, andere hatten auch die F&auml;higkeiten Schriftstile wie Fett oder Kursiv darzustellen. Mein Rechner setzte sogar einen Grafikbildschirm ein. Wie viele Zeilen der Bildschirm hatte, war egal, ebenso die Breite, nur 64 Zeichen mussten es mindestens sein. Ebenso konnte man ein 8 Zoll, 5,25, 3,5 oder 3 Zoll Laufwerk oder sogar eine Festplatte einsetzen. Anzahl der Sektoren, deren Gr&ouml;&szlig;e, Spurzahl und Dichte waren variabel. Formatierte Kapazit&auml;ten von Disketten lagen den auch zwischen 90 und 800 KByte und es gab &uuml;ber 100 Diskettenformate.<\/p>\n<p>Das war zu dieser Zeit einmalig. Wer einen Heimcomputer kaufte, konnte keine Software austauschen. Die Ataris, <a href=\"https:\/\/www.bernd-leitenberger.de\/apple-2.shtml\">Apple II<\/a> und Commodore VC20 \/ <a href=\"https:\/\/www.bernd-leitenberger.de\/c64.shtml\">C64<\/a> hatten alle einen 65092 Prozessor, aber die Software des einen lief nicht auf dem anderen. Ja selbst innerhalb eines Herstellers waren Rechner inkompatibel, so lief auf einem C64 nicht BASIC-Programme seines Vorg&auml;ngers VC20 ohne Anpassung, geschweige denn das man nicht den Quelltext, sondern wie bei CP\/M das ausf&uuml;hrbare Bin&auml;rfile startet.<\/p>\n<p>Nicht einmal UNIX das es damals gab und das entwickelt wurde damit es auf vielen Rechnerarchitekturen lief war soweit. Man konnte auf einem neuen Rechner Unix aus den Quellen &uuml;bersetzen, musste es aber in der Regel anpassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_17927\" class=\"pvc_stats all  \" data-element-id=\"17927\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Das ist der vorletzte von vier Teilen &uuml;ber das Innenleben von CP\/M. Erschienen sind: Teil 1 behandelt den Aufbau des Speichers und des Dateisystems Teil 2 behandelt den Aufbau einer Diskette und des Rechners, Bildschirm und Tastatur und sie lesen gerade: Teil 3 behandelt die BDOS-Funktionen, den Kommandointerpreeter, User Befehl und die Ger&auml;te. morgen erscheint [&hellip;]<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[5268,1351,5269,4455,4601],"class_list":["post-17927","post","type-post","status-publish","format-standard","hentry","category-computer","tag-bdos","tag-bios","tag-ccp","tag-cpm","tag-gary-kildall","entry"],"a3_pvc":{"activated":true,"total_views":174,"today_views":0},"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18676,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/05\/31\/die-glorreichen-10-programmiersprachen\/","url_meta":{"origin":17927,"position":0},"title":"Die glorreichen 10 \u2013 Programmiersprachen","author":"Bernd Leitenberger","date":"31. Mai 2026","format":false,"excerpt":"Ich wollte mal eine Reihe in dieser Rubrik \u00fcber Programmiersprachen machen. Zuerst dachte ich daran eine Liste nach meinen pers\u00f6nlichen Favoriten zu erstellen. Anfangs bef\u00fcrchtete ich, dass ich gar nicht auf 10 komme, aber es sind tats\u00e4chlich mehr, wenngleich ich in vielen Sprachen nur kleine Programme verfasst habe oder mich\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/4073c4f9dc6943a08702cdde13605d43","width":350,"height":200},"classes":[]},{"id":18406,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/23\/der-blogautor-von-der-ki-beurteilt\/","url_meta":{"origin":17927,"position":1},"title":"Der Blogautor von der KI beurteilt","author":"Bernd Leitenberger","date":"23. September 2025","format":false,"excerpt":"Ich nutze inzwischen auch eine KI. Prim\u00e4r zu Recherche, im Browser https:\/\/www.perplexity.ai die f\u00fcr Recherchen (nach Eigenauskunft) spezialisiert ist. Seit ich vor mehr als zwei Jahren die KI zum ersten Mal getestet habe, hat diese sich enorm gebessert. Sie fabuliert weniger und ist intelligenter. Damals konnte man noch die AI\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/vg01.met.vgwort.de\/na\/c334c52e97b74da9b82424a9e80c6d97","width":350,"height":200},"classes":[]},{"id":18458,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/10\/23\/die-agena-c-2\/","url_meta":{"origin":17927,"position":2},"title":"Die Agena C","author":"Bernd Leitenberger","date":"23. Oktober 2025","format":false,"excerpt":"Wie ihr sicher bemerkt habt, war es etwas ruhig hier im Blog. Der Grund ist ganz einfach, ich habe mich endlich entschlossen, einen Schlussstrich zu ziehen. Nein, nicht unter dem Blog. Seit f\u00fcnf Jahren will ich Band 2 des Apolloprogramms fertigstellen und habe in den letzten Jahren eigentlich immer nur\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg04.met.vgwort.de\/na\/d6474dec02b34cf385a0dfced0cffb64","width":350,"height":200},"classes":[]},{"id":18695,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/06\/06\/nasa-chaos-um-blue-moon-und-artemis-3\/","url_meta":{"origin":17927,"position":3},"title":"NASA Chaos um Blue Moon und Artemis 3","author":"Bernd Leitenberger","date":"6. Juni 2026","format":false,"excerpt":"Es gab ja letzte Woche die Explosion einer New Glenn auf der Startrampe. Das sah dramatisch aus und wie immer beim \u201eNew Space\u201c wei\u00df man bisher nichts \u00fcber die Ursache. Es wird eben nur noch kommuniziert was positiv ist, sodass die Sch\u00e4den nicht so schlimm sind wie man meint und\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"\/img\/bluemoon-mki-mockup.png","width":350,"height":200,"srcset":"\/img\/bluemoon-mki-mockup.png 1x, \/img\/bluemoon-mki-mockup.png 1.5x, \/img\/bluemoon-mki-mockup.png 2x, \/img\/bluemoon-mki-mockup.png 3x, \/img\/bluemoon-mki-mockup.png 4x"},"classes":[]},{"id":18542,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/02\/25\/mush-schleuder-auf-dem-mond\/","url_meta":{"origin":17927,"position":4},"title":"Musks &#8222;Schleuder&#8220; auf dem Mond","author":"Bernd Leitenberger","date":"25. Februar 2026","format":false,"excerpt":"Da k\u00fcndigt Jeff Bezos am 31.1.2026 an, das Blue Origin den Suborbitaltourismus f\u00fcr mindestens zwei Jahre einstellen will, um sich ganz auf den Blue Moon Mondlander zu konzentrieren. Und kaum ist das gesackt, will nun Elon Musk dann gleich eine ganze Stadt auf dem Mond bauen. (9.2.2026). Zufall? Anstatt das\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/64ef0834094b4d9b9af02f70b7ad22f7","width":350,"height":200},"classes":[]},{"id":18449,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/10\/16\/das-v4-wirds-schon-richten-2\/","url_meta":{"origin":17927,"position":5},"title":"Das V4 wirds schon richten (2)","author":"Bernd Leitenberger","date":"16. Oktober 2025","format":false,"excerpt":"So, heute der zweite Teil des Artikels von gestern. Nachdenken hilft Bei den Vers-Sprechen von Elon Musk hilft Nachdenken. Ich habe in der Tabelle auch die Gesamttreibstoffmenge angegeben: Parameter Starship V1 (2023\/24) Starship V2 (2025) Starship V3 (2026-) Starship V4 Nutzlast (wiederverwendbar) 15 t 35 t 100+ t 200+ Gesamtmasse\u2026","rel":"","context":"In &quot;SpaceX&quot;","block_context":{"text":"SpaceX","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/spacex\/"},"img":{"alt_text":"","src":"https:\/\/vg04.met.vgwort.de\/na\/d193ca8d21b14074b04b39cfcfcae20f","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/17927","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/comments?post=17927"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/17927\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=17927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=17927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=17927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}