jennings
A py65-compatible 6502/6510 MPU, assembler, and disassembler with first-class
support for all 105 documented NMOS 6510 illegal opcodes. Drop-in for py65:
change import py65… to import jennings….
Where py65 stubs the illegals (inst_not_implemented — a 0-cycle skip),
jennings executes them byte- and cycle-exact via deity-informant's
hardware-validated lift + PcodeVM engine, and its assembler/disassembler
decode them as real mnemonics instead of ???.
Install
pip install jennings # pulls deity-informant (pure-Python engine)
pip install jennings[dev] # + test/lint tooling (pytest, black, pylint, py65)
Use
from jennings.devices.mpu6502 import MPU
from jennings.memory import ObservableMemory
from jennings.disassembler import Disassembler
from jennings.assembler import Assembler
mpu = MPU(memory=ObservableMemory()) # same API as py65.devices.mpu6502.MPU
mpu.memory[0:2] = [0xAF, 0x10] # LAX $10 — an illegal py65 cannot run
mpu.step() # a, x <- mem[$10]; cycle-exact
Assembler(MPU()).assemble("SLO $20") # [0x07, 0x20]
Disassembler(MPU()).instruction_at(pc) # (len, "SLO $20")
Compatibility
Mirrors the py65 API surface used in practice: devices.mpu6502.MPU
(.step/.reset/.irq/.nmi, a/x/y/sp/p/pc/memory/processorCycles,
ByteAt/WordAt, disassemble/instruct/cycletime/extracycles),
memory.ObservableMemory, disassembler.Disassembler, assembler.Assembler,
utils.addressing.AddressParser.
Every legal opcode is validated byte-, flag-, and cycle-exact against py65 in CI; the illegals are validated by NMS decomposition and (via the engine) byte-exact against sidplayfp. See docs/design.md, docs/illegal-opcodes.md, and docs/migrating-from-py65.md.
Limitations
No BCD (decimal-mode ADC/SBC), matching the deity-informant engine and the C64
target domain (playroutines run CLD). py65.monitor is not reimplemented.
Metadata
Release files for jennings 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jennings-0.1.3.tar.gz | 21.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jennings-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.9 kB
Release files / jennings-0.1.3.tar.gz
| Download URL | jennings-0.1.3.tar.gz |
|---|---|
| Size | 21.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
77c07b95719d12c50aa705869720c3acf7e56a1c04981a271c89da7933b8d5f4
|
|
BLAKE2b-256 checksum How to use checksums |
154c9bc2dac4a8ca066a88c1f77c50b6a2194f7622e89f317ec71f328ec6bc65
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency logRelease files / jennings-0.1.3-py3-none-any.whl
| Download URL | jennings-0.1.3-py3-none-any.whl |
|---|---|
| Size | 16.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
41b5738a4dc74c39de07f63c5a486712f4cfa30c786e8cd54c7d0bb77813f9d5
|
|
BLAKE2b-256 checksum How to use checksums |
eb4547548ff2d6e10365bd5dac6ecbc09711c7097b006e9f7858e6768b1c198d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency log