P-Code
# P-Code

P-Code 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 virtuellen Maschine als geistigen Vorläufer der heutigen Java Virtual Machine betrachten.

## Plattformen

Durch die Unabhängigkeit von bestimmten Rechnerarchitekturen konnte das P-System auf verschiedenste Plattformen portiert werden:

* 6502 (Apple II, CBM-8000-Serie, BBC Micro)
* DEC LSI-11
* DEC PDP-11
* Zilog Z80 (CP/M-Systeme)
* Motorola 68000
* Intel 8086 (IBM PC)
* Texas Instruments TMS9900 (TI99)

## Funktionsumfang der P-Maschine

* Adressierung von Variablen, Strings, Byte-Arrays
* Logische Verknüpfungen und Vergleiche
* Arithmetik mit Konstanten und Variablen der Typen Integer, Real, Set, Array, String
* Verzweigungen, Sprünge
* Prozedur- und Funktionsaufrufe
* Overlay-Prozeduren
* Systemfunktionen und -prozeduren

## Register des Emulators

Die P-Maschine ist eine 16-Bit-Maschine; der Adressraum ist damit auf 64 KiB beschränkt. Sie ist aber in der Lage, mehrere Adressräume zu verwalten, beispielsweise 128 KiB in Version IV. Zur Emulation des P-Codes dienen folgende Register (Pointer):

| SP: | Stack-Pointer | Zeiger auf das oberste Wort im Stack. Dient der Parameterübergabe und als Operandenquelle für den Interpreter. |
| - | - | - |
| IPC: | Interpreter Program Counter | Adresse der nächsten P-Code-Instruktion im Codesegment der aktuellen Prozedur |
| SEG: | Segment Pointer | Zeiger auf das Prozedurverzeichnis des aktuellen Segments |
| JTAB: | Jump Table Pointer | Zeiger auf die Sprungtabelle des aktuellen Segments |
| KP: | Program Stack Pointer | Zeiger auf das Ende des Programm-Stacks |
| MP: | Markstack Pointer | Zeiger auf den Aktivierungs-Record der aktuellen Prozedur zum Zugriff auf die lokalen Variablen |
| NP: | New Pointer | Zeiger auf das Ende des dynamischen Heaps |
| BASE: | Base Procedure | Zeiger auf den Aktivierungs-Record der Basis-Prozedur zum Zugriff auf die globalen Variablen |

## P-Code (Befehlssatz der P-Maschine)

Der Befehlscode der Pseudo-Maschine ist ein oder zwei Byte lang und wird von bis zu vier Operanden gefolgt. Es gibt folgende Befehlsklassen:

* 1-Wort-Transportbefehle
* Mehr-Wort-Transportbefehle
* Byte-Array-Behandlung
* String-Behandlung
* Record und Array-Behandlung
* Dynamische Speicherallokation
* Arithmetik-Befehle
* Sprungbefehle
* Prozedur- und Funktionsaufrufe
* Unterstützungs-Routinen

## Verbindung zwischen P-Maschine und Betriebssystem

Das UCSD-Pascal-Betriebssystem und die virtuelle P-Maschine tauschen Informationen über die Systemvariable SYSCOM aus. Diese befindet sich im äußeren Block des Betriebssystems. Dieser Speicherbereich ist der P-Maschine „bekannt“.

## P-Code-Beispiel

Auszug aus einem Disassembler-Listing:

In UCSD-Pascal sieht die Prozedur so aus:

