Highly optimizing PL/M-80 compiler targeting 8080/Z80
Project description
uplm80 - PL/M-80 Compiler
A modern PL/M-80 compiler targeting Intel 8080 and Zilog Z80 assembly language.
PL/M-80 was the primary systems programming language for CP/M and other 8080/Z80 operating systems. This compiler can rebuild original CP/M utilities from their PL/M source code.
Repository: https://github.com/avwohl/uplm80
Features
- Full PL/M-80 language support
- Targets both 8080 and Z80 instruction sets
- Multiple optimization passes (peephole, post-assembly tail merging)
- Generates relocatable object files compatible with standard CP/M linkers
- Produces code competitive with the original Digital Research compiler
Code Quality
Compiled output is comparable to the original Digital Research PL/M-80 compiler:
| Program | DR PL/M-80 | uplm80 | Difference |
|---|---|---|---|
| PIP.COM | 7424 bytes | 7127 bytes | -4.0% |
Installation
Install from PyPI:
pip install uplm80
Or install from source:
git clone https://github.com/avwohl/uplm80.git
cd uplm80
pip install -e .
Usage
Compile PL/M-80 to Assembly
uplm80 input.plm -o output.mac
Or run as a module:
python -m uplm80.compiler input.plm -o output.mac
Options:
-t 8080or-t z80- Target CPU (default: Z80)-o output.mac- Output file name
Post-Assembly Optimization (Optional)
python -m uplm80.postopt output.mac -o output_opt.mac
Performs multi-pass tail merging and skip trick optimizations.
Assemble and Link
Use your preferred 8080/Z80 assembler and linker. Example with um80/ul80:
um80 output.mac # Assemble to .rel
ul80 -o program.com output.rel runtime.rel # Link to CP/M .com
Language Reference
PL/M-80 is a typed systems programming language with:
- Data types: BYTE (8-bit), ADDRESS (16-bit)
- Variables: Scalars, arrays, structures, BASED variables (pointers)
- Control flow: DO/END, DO WHILE, DO CASE, IF/THEN/ELSE
- Procedures: With parameters, local variables, recursion
- Built-in functions: HIGH, LOW, DOUBLE, SHL, SHR, ROL, ROR, etc.
- I/O: INPUT, OUTPUT for port access
Example:
hello: DO;
DECLARE message DATA ('Hello, World!$');
DECLARE i BYTE;
print: PROCEDURE(addr) PUBLIC;
DECLARE addr ADDRESS;
/* CP/M BDOS print string */
CALL mon1(9, addr);
END print;
CALL print(.message);
END hello;
Runtime Library
The compiler generates calls to these runtime routines (provide in a separate .rel file):
| Routine | Description |
|---|---|
??MUL |
16-bit unsigned multiply |
??DIV |
16-bit unsigned divide |
??MOD |
16-bit unsigned modulo |
??SHL |
16-bit shift left |
??SHR |
16-bit logical shift right |
??SHRS |
16-bit arithmetic shift right |
??MOVE |
Block memory move |
CP/M Programs
For CP/M programs, provide stubs for:
MON1,MON2,MON3- BDOS callsBOOT- Warm bootBDISK,MAXB,FCB,BUFF,IOBYTE- System variables
Project Structure
uplm80/
├── compiler.py # Main compiler driver
├── lexer.py # Tokenizer
├── parser.py # PL/M-80 parser
├── ast_nodes.py # AST definitions
├── codegen.py # Code generator
├── peephole.py # Peephole optimizer
├── postopt.py # Post-assembly optimizer
└── symbols.py # Symbol table
License
This project is licensed under the GNU General Public License v3.0 or later - see the LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
Acknowledgments
- Intel for creating PL/M-80
- Digital Research for creating CP/M
- The CP/M source code preservation efforts that made the original PL/M sources available
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uplm80-0.2.2.tar.gz.
File metadata
- Download URL: uplm80-0.2.2.tar.gz
- Upload date:
- Size: 116.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce82fb7f006019f0b3b52c8b2c9a9374387c5c5f609714f4d549c067a4bbc169
|
|
| MD5 |
43b5e7fa40e7ae8a437d4b678a36f857
|
|
| BLAKE2b-256 |
5383a595c269d730c2a8507733b7eab4e50ec6096f34e57565f02bb9de26ac01
|
File details
Details for the file uplm80-0.2.2-py3-none-any.whl.
File metadata
- Download URL: uplm80-0.2.2-py3-none-any.whl
- Upload date:
- Size: 117.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0208a9a38a5c5661e0e3f26b6e59f11a66b51eb871387d9c04e5258761beb0f0
|
|
| MD5 |
70f803f6a915e88b820265789f6e4b10
|
|
| BLAKE2b-256 |
8ff3e28c06f19ef5cd6e9ba3e3c9893cd4aaf3a173a8dcf5ed903419f7c01578
|