<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=P-Code</id>
	<title>P-Code - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=P-Code"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=P-Code&amp;action=history"/>
	<updated>2026-05-18T13:46:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=P-Code&amp;diff=95663&amp;oldid=prev</id>
		<title>imported&gt;Duschgeldrache2: /* Funktionsumfang der P-Maschine */ wikilink korr</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=P-Code&amp;diff=95663&amp;oldid=prev"/>
		<updated>2024-08-16T02:18:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Funktionsumfang der P-Maschine: &lt;/span&gt; wikilink korr&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;P-Code&amp;#039;&amp;#039;&amp;#039; ist der [[Befehlssatz]] einer Pseudo-Maschine (oder P-Maschine), also einer virtuellen CPU, die P-Code als [[Maschinensprache]] ausführt. Der P-Code war ein Computer- bzw. CPU-unabhängiger Code und war Teil der Entwicklungsumgebung [[UCSD Pascal]]. Die Umsetzung in die Maschinensprache der CPU erfolgt durch den Interpreter der P-Maschine. Man kann den P-Code und das Konzept der [[Virtuelle Maschine|virtuellen Maschine]] als geistigen Vorläufer der heutigen [[Java Virtual Machine]] betrachten.&lt;br /&gt;
&lt;br /&gt;
== Plattformen ==&lt;br /&gt;
Durch die Unabhängigkeit von bestimmten Rechnerarchitekturen konnte das P-System auf verschiedenste Plattformen portiert werden:&lt;br /&gt;
&lt;br /&gt;
* [[6502]] ([[Apple II]], [[CBM-8000-Serie]], [[BBC Micro]])&lt;br /&gt;
* [[Digital Equipment Corporation|DEC]] [[LSI-11]]&lt;br /&gt;
* DEC [[PDP-11]]&lt;br /&gt;
* [[Zilog Z80]] ([[CP/M]]-Systeme)&lt;br /&gt;
* [[Motorola 68000]]&lt;br /&gt;
* [[Intel 8086]] ([[IBM PC]])&lt;br /&gt;
* [[Texas Instruments TMS9900]] ([[Texas Instruments TI-99/4|TI99]])&lt;br /&gt;
&lt;br /&gt;
== Funktionsumfang der P-Maschine ==&lt;br /&gt;
* Adressierung von Variablen, Strings, [[Byte]]-Arrays&lt;br /&gt;
* Logische Verknüpfungen und Vergleiche&lt;br /&gt;
* [[Arithmetik]] mit [[Konstante (Programmierung)|Konstanten]] und [[Variable (Programmierung)|Variablen]] der Typen [[Integer (Datentyp)|Integer]], [[Datentyp#Datentypen in Programmiersprachen|Real]], [[Menge (Datenstruktur)|Set]], [[Feld (Datentyp)|Array]], [[Zeichenkette|String]]&lt;br /&gt;
* Verzweigungen, Sprünge&lt;br /&gt;
* [[Prozedur (Programmierung)|Prozedur]]- und [[Funktion (Programmierung)|Funktionsaufrufe]]&lt;br /&gt;
* [[Overlay (Programmierung)|Overlay]]-Prozeduren&lt;br /&gt;
* [[Systemaufruf|Systemfunktion]]en und -prozeduren&lt;br /&gt;
&lt;br /&gt;
== Register des Emulators ==&lt;br /&gt;
Die P-Maschine ist eine [[16-Bit]]-Maschine; der [[Adressraum]] ist damit auf 64&amp;amp;nbsp;KiB beschränkt. Sie ist aber in der Lage, mehrere Adressräume zu verwalten, beispielsweise 128&amp;amp;nbsp;KiB in Version IV. Zur [[Emulation]] des P-Codes dienen folgende [[Register (Computer)|Register]] ([[Zeiger (Informatik)|Pointer]]):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;SP&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Stack-Pointer&amp;#039;&amp;#039;||Zeiger auf das oberste Wort im [[Stapelspeicher|Stack]]. Dient der Parameterübergabe und als Operandenquelle für den [[Interpreter]].&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;IPC&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Interpreter Program Counter&amp;#039;&amp;#039;||Adresse der nächsten P-Code-[[Instruktion]] im [[Codesegment]] der aktuellen Prozedur&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;SEG&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Segment Pointer&amp;#039;&amp;#039;||Zeiger auf das Prozedurverzeichnis des aktuellen Segments&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;JTAB&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Jump Table Pointer&amp;#039;&amp;#039;||Zeiger auf die Sprungtabelle des aktuellen Segments&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;KP&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Program Stack Pointer&amp;#039;&amp;#039;||Zeiger auf das Ende des [[Computerprogramm|Programm]]-Stacks&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;MP&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Markstack Pointer&amp;#039;&amp;#039;||Zeiger auf den Aktivierungs-Record der aktuellen Prozedur zum Zugriff auf die lokalen Variablen&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;NP&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;New Pointer&amp;#039;&amp;#039;||Zeiger auf das Ende des dynamischen Heaps&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;BASE&amp;#039;&amp;#039;&amp;#039;:||&amp;#039;&amp;#039;Base Procedure&amp;#039;&amp;#039;||Zeiger auf den Aktivierungs-Record der Basis-Prozedur zum Zugriff auf die globalen Variablen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== P-Code (Befehlssatz der P-Maschine) ==&lt;br /&gt;
Der Befehlscode der Pseudo-Maschine ist ein oder zwei Byte lang und wird von bis zu vier [[Operand]]en gefolgt. Es gibt folgende Befehlsklassen:&lt;br /&gt;
* 1-Wort-Transportbefehle&lt;br /&gt;
* Mehr-Wort-Transportbefehle&lt;br /&gt;
* Byte-Array-Behandlung&lt;br /&gt;
* String-Behandlung&lt;br /&gt;
* Record und Array-Behandlung&lt;br /&gt;
* Dynamische Speicherallokation&lt;br /&gt;
* Arithmetik-Befehle&lt;br /&gt;
* Sprungbefehle&lt;br /&gt;
* Prozedur- und Funktionsaufrufe&lt;br /&gt;
* Unterstützungs-Routinen&lt;br /&gt;
&lt;br /&gt;
== Verbindung zwischen P-Maschine und Betriebssystem ==&lt;br /&gt;
Das [[UCSD Pascal|UCSD-Pascal]]-[[Betriebssystem]] und die virtuelle P-Maschine tauschen Informationen über die Systemvariable &amp;#039;&amp;#039;&amp;#039;SYSCOM&amp;#039;&amp;#039;&amp;#039; aus. Diese befindet sich im äußeren [[Datenblock|Block]] des Betriebssystems. Dieser Speicherbereich ist der P-Maschine „bekannt“.&lt;br /&gt;
&lt;br /&gt;
== P-Code-Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Auszug aus einem Disassembler-Listing:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attribute Table&lt;br /&gt;
-------------------------&lt;br /&gt;
Procedure No.:   37&lt;br /&gt;
Lex Level:        0&lt;br /&gt;
EnterIC:         54&lt;br /&gt;
Exit IC:          7&lt;br /&gt;
Parameter Size:   0 words&lt;br /&gt;
Data Size:        2 words&lt;br /&gt;
-------------------------&lt;br /&gt;
Block No:|58&lt;br /&gt;
Block Offset:|132&lt;br /&gt;
&lt;br /&gt;
Offset P-Code             Hex-Code&lt;br /&gt;
     0 CBP     36         C224&lt;br /&gt;
     2 LOD      1     1   B60101&lt;br /&gt;
     5 SRO      1         AB01&lt;br /&gt;
     7 SLDO1              E4&lt;br /&gt;
     8 INC     31         A21F&lt;br /&gt;
    10 SRO      2         AB02&lt;br /&gt;
    12 SLDC3              03&lt;br /&gt;
    13 CSP   UNITCLEA     9E26&lt;br /&gt;
    15 SLDO2              E9&lt;br /&gt;
    16 INC 1              A201&lt;br /&gt;
    18 SLDC8              08&lt;br /&gt;
    19 SLDC0              00&lt;br /&gt;
    20 LDP                BA&lt;br /&gt;
    21 SLDC0              00&lt;br /&gt;
    22 NEQI               CB&lt;br /&gt;
    23 FJP     36         A10B&lt;br /&gt;
    25 SLDC3              03&lt;br /&gt;
    26 SLDO2              E9&lt;br /&gt;
    27 INC      1         A201&lt;br /&gt;
    29 SLDC8              08&lt;br /&gt;
    30 SLDC0              00&lt;br /&gt;
    31 LDP                BA&lt;br /&gt;
    32 CBP     52         C234&lt;br /&gt;
    34 UJP     45         B909&lt;br /&gt;
    36 SLDC6              06&lt;br /&gt;
    37 SLDD02             E9&lt;br /&gt;
    38 INC      4         A204&lt;br /&gt;
    40 SLDC8              08&lt;br /&gt;
    41 SLDC8              08&lt;br /&gt;
    42 LDP                BA&lt;br /&gt;
    43 CBP     52         C234&lt;br /&gt;
    45 RBP      0         C100&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In UCSD-Pascal sieht die Prozedur so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
PROCEDURE CLEARSCREEN;                (*Bemerkung*)&lt;br /&gt;
  BEGIN HOMECURSOR;                   (*Offset  0*)&lt;br /&gt;
    WITH SYSCOM^,CRTCTRL DO           (*Offset 10*)&lt;br /&gt;
      BEGIN&lt;br /&gt;
        UNITCLEAR(3);                 (*Offset 13*)&lt;br /&gt;
        IF ERASEEOS &amp;lt;&amp;gt; CHR(0) THEN    (*Offset 23*)&lt;br /&gt;
          PUTPREFIXED(3,ERASEEOS)     (*Offset 32*)&lt;br /&gt;
        ELSE                          (*Offset 34*)&lt;br /&gt;
          PUTPREFIXED(6,CLEARSCREEN)  (*Offset 43*)&lt;br /&gt;
      END&lt;br /&gt;
END (*CLEARSCREEN*) ;                 (*Offset 45*)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Apple Pascal]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.sageandstride.org/html/manuals.html Handbücher]&lt;br /&gt;
* [http://klebsch.de Implementierung in C]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Pascal (Programmiersprache)]]&lt;br /&gt;
[[Kategorie:Virtuelle Maschine]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Duschgeldrache2</name></author>
	</entry>
</feed>