Pasmo — это кроссплатформенный, легкий и надежный кросс-ассемблер для процессора Z80, написанный на стандартном C++. Его главная философия — простота сборки, установки и использования. 🎯 Этот инструмент позволяет создавать исполняемый код сразу в самых популярных форматах для ретро-компьютеров, таких как ZX Spectrum, Amstrad CPC, MSX и CP/M.

✨ Основные особенности и достоинства​

  • Мультиплатформенность 🖥️: Работает под Windows, Linux, macOS. Исходный код легко компилируется любым современным C++ компилятором.
  • Не требует линкера 🔗: Генерирует готовый, фиксированный (non-relocatable) машинный код. Не нужно отдельных этапов компоновки.
  • Богатая поддержка форматов вывода 💾: Может создавать файлы прямо для эмуляторов и реального железа:
    • .TAP, .TZX для ZX Spectrum (лента)
    • .CDT для Amstrad CPC (лента)
    • PLUS3DOS для Spectrum +3 (дискета)
    • AMSDOS для Amstrad CPC (дискета)
    • Сырой бинарный код, Intel HEX, PRL для CP/M.
  • Совместимый синтаксис 📝: Поддерживает различные стили написания чисел и директив, привычные программистам со старых ассемблеров.
  • Уникальная экспериментальная функция 🧪: С опцией --86 может транслировать исходник Z80 в код для процессора 8086, создавая .COM файлы для MS-DOS.

📦 Установка и первая сборка​

Вариант 1: Готовый исполняемый файл (Windows)​

Самый простой способ — скачать готовый .zip архив (например, pasmo-0.5.3.zip) с официальной страницы, распаковать и запускать pasmo.exe из командной строки.

Вариант 2: Компиляция из исходников (Linux/macOS/Windows)​

Если для вашей ОС нет готового бинарника или нужна последняя версия:

  1. Скачайте архив с исходниками (например, pasmo-0.5.5.tar.gz).
  2. Распакуйте: tar -xzf pasmo-0.5.5.tar.gz
  3. Перейдите в папку и выполните стандартную процедуру:
Bash:
./configure
make
sudo make install  # (для установки в системные папки)

Для Windows можно использовать Cygwin или MinGW с прилагаемым Makefile.

Вариант 3: Через пакетный менеджер​

  • Debian/Ubuntu: Установите командой sudo apt-get install pasmo.
  • Mac OS X: Доступен готовый .sitx архив.

⚙️ Использование: от команды до готового файла​

Основной формат вызова Pasmo из командной строки:
Bash:
pasmo [опции] исходник.asm выходной_файл [файл_символов]

🔧 Ключевые опции для ZX Spectrum​

  • --tap или --tzx → Создает файл образа ленты только с машинным кодом. Для загрузки в Basic: LOAD "" CODE.
  • --tapbas или --tzxbas → Создает ленту с автозагрузчиком на Basic! В образ добавляется программа-загрузчик, которая автоматически вызывает CLEAR, загружает ваш код и запускает его (если задана директива END). Идеально для готовых релизов.
  • --plus3dos → Создает файл для загрузки с диска Spectrum +3.
  • --bin → Генерирует сырой бинарный код (по умолчанию).
  • -I путь → Добавляет путь для поиска файлов, подключаемых директивами INCLUDE и INCBIN.
  • --equ имя=значение → Предварительно определяет символ, как будто в коде есть имя EQU значение. Полезно для условной компиляции.
Практический пример:
Bash:
# Создаем TAP-файл с автозапуском для вашей игры
pasmo --tzxbas mygame.asm mygame.tzx

# Создаем чистый бинарный блок кода для вставки в другой проект
pasmo --bin library.asm library.bin

📝 Синтаксис и особенности работы​

Организация кода и памяти​

  • Используйте директиву ORG, чтобы указать, по какому адресу в памяти должен располагаться код. Например, ORG 32768 (или #8000 в hex) — стандартный адрес для программ на ZX Spectrum 48K.
  • Конец программы и точка входа задаются директивой END. Аргумент этой директивы — адрес, с которого начнется выполнение после загрузки. Пример: END start.
  • Для подключения внешних файлов (исходников или данных) используйте INCLUDE "файл.asm" и INCBIN "данные.bin".

Система обозначений и вычислений​

Pasmo гибок в записи чисел, поддерживая форматы разных ассемблеров:

  • Шестнадцатеричные: $FF, #FF, 0FFh, &HFF.
  • Двоичные: %11110000, 11110000b.
  • Десятичные: 255, 255d.
  • Восьмеричные: 377o, &O377.
Для удобства чтения в числах можно ставить знаки $: 1$0000 эквивалентно 10000.

Локальные метки и условная компиляция​

  • Локальные метки можно создавать, начиная их имя с символа _. При использовании опции --alocal все такие метки автоматически становятся локальными.
  • Для условной сборки используйте директивы IF, ELSE, ENDIF. Условием может быть выражение или проверка определения метки:
Код:
IFDEF DEBUG_MODE
    ld a, 1 ; Код для отладки
ELSE
    ld a, 0 ; Релизный код
ENDIF

  • Символ DEBUG_MODE можно определить в коде (DEBUG_MODE EQU 1) или передать через командную строку (--equ DEBUG_MODE=1).

🧪 Работа с различными форматами вывода​

  • Спектрум (лента) 🎞️: Опции --tapbas/--tzxbas — лучший выбор для финального файла. Эмулятор или устройство вроде DivMMC воспримет его как обычную кассету с программой.
  • Спектрум +3 (дискета) 💿: --plus3dos. Получившийся файл можно поместить в образ дискеты эмулятора.
  • Проекты из нескольких модулей: Pasmo сам не линкует .rel файлы, но вы можете использовать --bin для создания отдельных блоков кода, а затем объединять их с помощью INCBIN в главном файле или внешними утилитами.
  • Для отладки 🐛: При сборке можно попросить Pasmo создать файл со всеми метками (третий аргумент в командной строке). Этот файл в формате EQU-директив можно загрузить в отладчик эмулятора (например, в DeZog для VS Code), чтобы видеть имена меток вместо голых адресов.

💎 Итог: почему Pasmo?​

✅ Простота и скорость: Запустил — получил готовый файл. Нет лишних шагов.

✅ Прямая работа с форматами эмуляторов: Не нужны конвертеры.

✅ Проверенная надежность: Активно используется сообществом ретро-разработчиков много лет.

✅ Идеален для обучения и небольших проектов: Прямой контроль над кодом и памятью.

Pasmo — это прагматичный и эффективный инструмент, который отлично подходит для создания игр, демо и утилит под ZX Spectrum и другие 8-битные платформы. Он не пытается быть навороченной IDE, а блестяще выполняет свою главную задачу — превращать читаемый ассемблерный код в рабочую машинную программу.

Ссылки для углубленного изучения: