Skip to main content

Highly optimizing PL/M-80 compiler targeting 8080/Z80

Project description

uplm80 - PL/M-80 Compiler

PyPI version License: GPL v3

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 8080 or -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 calls
  • BOOT - Warm boot
  • BDISK, 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uplm80-0.2.2.tar.gz (116.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uplm80-0.2.2-py3-none-any.whl (117.2 kB view details)

Uploaded Python 3

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

Hashes for uplm80-0.2.2.tar.gz
Algorithm Hash digest
SHA256 ce82fb7f006019f0b3b52c8b2c9a9374387c5c5f609714f4d549c067a4bbc169
MD5 43b5e7fa40e7ae8a437d4b678a36f857
BLAKE2b-256 5383a595c269d730c2a8507733b7eab4e50ec6096f34e57565f02bb9de26ac01

See more details on using hashes here.

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

Hashes for uplm80-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0208a9a38a5c5661e0e3f26b6e59f11a66b51eb871387d9c04e5258761beb0f0
MD5 70f803f6a915e88b820265789f6e4b10
BLAKE2b-256 8ff3e28c06f19ef5cd6e9ba3e3c9893cd4aaf3a173a8dcf5ed903419f7c01578

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page