p code
P-code is the instruction set of a pseudo-machine (or P-machine), i.e. a virtual CPU that executes P-code as machine language . The P-Code was a computer or CPU-independent code and was part of the UCSD Pascal development environment . The implementation in the machine language of the CPU is done by the interpreter of the P machine. The P-Code and the concept of the virtual machine can be seen as the intellectual forerunners of today's Java Virtual Machine .
Platforms
As it is independent of certain computer architectures, the P-System could be ported to a wide variety of platforms:
- 6502 ( Apple II )
- DEC LSI-11
- DEC PDP-11
- Zilog Z80 systems
- Motorola 68000
- Intel 8086 ( IBM PC )
- Texas Instruments TMS9900 ( TI99 )
Functional scope of the P machine
- Addressing of variables, strings, byte arrays
- Logical links and comparisons
- Arithmetic with constants and variables of the types integer , real , set , array , string
- Branches, jumps
- Procedure and function calls
- Overlay procedures
- System functions and procedures
Register of the emulator
The P machine is a 16-bit machine; the address space is therefore limited to 64 KiB. However, it is able to manage several address spaces, for example 128 KiB in version IV. The following registers ( pointers ) are used to emulate the P code :
| SP : | Stack pointer | Pointer to the top word in the stack . Used to pass parameters and as an operand source for the interpreter . |
| IPC : | Interpreter Program Counter | Address of the next P-code instruction in the code segment of the current procedure |
| SEG : | Segment pointer | Pointer to the procedure directory of the current segment |
| JTAB : | Jump table pointer | Pointer to the jump table of the current segment |
| KP : | Program stack pointer | Pointer to the end of the program stack |
| MP : | Markstack pointer | Pointer to the activation record of the current procedure for access to the local variables |
| NP : | New pointer | Pointer to the end of the dynamic heap |
| BASE : | Base Procedure | Pointer to the activation record of the basic procedure for access to the global variables |
P code (instruction set of the P machine)
The instruction code of the pseudo-machine is one or two bytes long and is followed by up to four operands . There are the following command classes:
- 1-word transport commands
- Multi-word transport commands
- Byte array handling
- String treatment
- Record and array handling
- Dynamic memory allocation
- Arithmetic commands
- Jump commands
- Procedure and function calls
- Support routines
Connection between P machine and operating system
The UCSD-Pascal - operating system and the virtual P-machine exchange information on the system variable SYSCOM out. This is located in the outer block of the operating system. This memory area is "known" to the P machine.
P-code example
Extract from a disassembler listing:
Attribute Table
-------------------------
Procedure No.: 37
Lex Level: 0
EnterIC: 54
Exit IC: 7
Parameter Size: 0 words
Data Size: 2 words
-------------------------
Block No:|58
Block Offset:|132
Offset P-Code Hex-Code
0 CBP 36 C224
2 LOD 1 1 B60101
5 SRO 1 AB01
7 SLDO1 E4
8 INC 31 A21F
10 SRO 2 AB02
12 SLDC3 03
13 CSP UNITCLEA 9E26
15 SLDO2 E9
16 INC 1 A201
18 SLDC8 08
19 SLDC0 00
20 LDP BA
21 SLDC0 00
22 NEQI CB
23 FJP 36 A10B
25 SLDC3 03
26 SLDO2 E9
27 INC 1 A201
29 SLDC8 08
30 SLDC0 00
31 LDP BA
32 CBP 52 C234
34 UJP 45 B909
36 SLDC6 06
37 SLDD02 E9
38 INC 4 A204
40 SLDC8 08
41 SLDC8 08
42 LDP BA
43 CBP 52 C234
45 RBP 0 C100
In UCSD-Pascal the procedure looks like this:
PROCEDURE CLEARSCREEN; (*Bemerkung*)
BEGIN HOMECURSOR; (*Offset 0*)
WITH SYSCOM^,CRTCTRL DO (*Offset 10*)
BEGIN
UNITCLEAR(3); (*Offset 13*)
IF ERASEEOS <> CHR(0) THEN (*Offset 23*)
PUTPREFIXED(3,ERASEEOS) (*Offset 32*)
ELSE (*Offset 34*)
PUTPREFIXED(6,CLEARSCREEN) (*Offset 43*)
END
END (*CLEARSCREEN*) ; (*Offset 45*)