Skip to main content

pyvacs

A Python assembler and disassembler for the Signetics/Philips 2650 microprocessor family.

pyvacs is a clean-room Python reimplementation of the classic VACS 1.24 assembler by A.C. Verschueren and W.H. Taphoorn (later ported to Windows by D.D. Spreen). It targets the same 2650 instruction set and opcode encodings, and adds a round-trip-safe disassembler so you can take a ROM image apart and put it back together byte-for-byte.

The 2650 powered consoles such as the Emerson Arcadia 2001 and its international clones — including the Australian-market Fountain Force 2 — as well as the Interton VC 4000 and a number of arcade boards.

Features

  • Full 2650 instruction set with every addressing mode (inherent, register, immediate, relative, absolute, zero-page branch, and absolute-indexed with auto-increment/decrement).
  • Two-pass assembler with labels, EQU/SET, expressions, and the ORG, DB/BYTE, DW/WORD, DD, DS, DBX, DBFILL directives.
  • VACS-style number literals ($1F, %1010, &17, 0FFh, 1010b) and a full expression evaluator (+ - * / MOD, shifts, bitwise, comparisons, HI/LO, $ location counter, character constants).
  • Predefined condition symbols (eq, gt, lt, un, plus z/p/n).
  • Round-trip-safe disassembler: any byte it cannot decode as a faithful instruction is emitted as a db, guaranteeing reassembly reproduces the original bytes.
  • Two command-line tools and a small importable API.

Install

pip install pyvacs

Or from a checkout:

pip install -e ".[dev]"

Command line

Assemble source to a binary:

pyvacs-asm program.asm -o program.bin

Disassemble a binary (with an address/hex listing):

pyvacs-dasm program.bin --listing

Disassemble to reassemblable source loaded at a given address:

pyvacs-dasm game.bin --origin 0x0000 -o game.asm

Library

from pyvacs import assemble, to_source

binary = assemble("""
        org $0000
start:  eorz r0
        bctr,un start
        end start
""").to_bytes()

source = to_source(binary, origin=0)   # round-trips back to `binary`

Example

        org $0000
start:  eorz  r0              ; clear register 0
        bctr,un go
        retc,un
go:     lodi,r0 $00
        loda,r0 msg,r1,+      ; load, auto-increment index r1
        comi,r0 $ff
        bcfr,eq done
        bcta,un go
done:   nop
msg:    db    $21,$1e,$ff
        end   start

Development

pip install -e ".[dev]"
pytest                 # tests + coverage (>85% enforced)
black --check src tests
pylint src/pyvacs

ROM test fixtures

The test-suite round-trips real Fountain Force 2 / Arcadia 2001 cartridge ROMs through the disassembler and assembler. The ROM images are not checked into this repository: on first run the tests download the TOSEC Arcadia 2001 set from the Internet Archive and cache it under tests/.romcache/ (git-ignored). If the download is unavailable the ROM-dependent tests skip automatically, so the core suite still runs offline. Set PYVACS_SKIP_ROM_TESTS=1 to skip them explicitly.

License

Apache License 2.0. See LICENSE.

The 2650 instruction encodings are derived by inspection of the public-domain VACS sources; no VACS code is included here.

Metadata

Release files for pyvacs 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyvacs 0.1.0
File Size Uploaded
pyvacs-0.1.0.tar.gz 35.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyvacs 0.1.0
File Interpreter ABI Platform
pyvacs-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 62.3 kB

Release files / pyvacs-0.1.0.tar.gz

Download URL pyvacs-0.1.0.tar.gz
Size 35.9 kB
Tags Source
SHA-256 checksum
How to use checksums
0b8fe70a9fd033a64410d44c45c9396ec2e60d4e09ade8faa4406c518178daeb
BLAKE2b-256 checksum
How to use checksums
16361a9f164c06c6991109643306f0c94fed9c566f53edfad094d9462994f663
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 19, 2026.

Transparency log

Release files / pyvacs-0.1.0-py3-none-any.whl

Download URL pyvacs-0.1.0-py3-none-any.whl
Size 26.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
30f3c08531e4a738e92475f5235a496d95ac4f81bdeb6eda920d5d5364dcdb60
BLAKE2b-256 checksum
How to use checksums
b3a504cf668a8b129d8cbbe460fdf572807be8c16cbc41b36753ecb91292f8f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page