Часть 1: Что такое SjASMPlus и почему он?
SjASMPlus — это современный, активно развиваемый кроссплатформенный ассемблер и менеджер проектов для процессора Z80 и совместимых. Он пришел на смену старому доброму SjASM.Преимущества для спектрумиста:
- Кроссплатформенность: Работает под Windows, Linux, macOS.
- Мощный препроцессор: Поддерживает директивы #include, #define, #if, макросы, что делает код модульным и читаемым.
- Управление памятью: Директивы MMU, PAGE, SLOT для работы с банковой памятью (например, для ZX Spectrum 128K/+2/+3).
- Генерация современных форматов: Может создавать не только .TAP и .TZX, но и .TRD (дискеты), .SNA (снапшоты), .NEX (расширенный формат для ZX Spectrum Next).
- Встроенный эмулятор (бета): Позволяет тестировать код без переключения между программами.
- Интеграция: Легко встраивается в любую IDE или текстовый редактор.
Часть 2: Установка и базовая настройка
Шаг 1: Скачивание- Перейдите на официальный репозиторий: https://github.com/z00m128/sjasmplus
- В разделе Releases скачайте последнюю стабильную версию.
- Для Windows: архив sjasmplus-win-x.y.z.zip. Извлеките sjasmplus.exe в удобную папку, например, C:\Dev\ZX\.
- Для Linux/macOS: соберите из исходников (см. инструкцию в README) или найдите в пакетном менеджере (например, apt install sjasmplus в некоторых дистрибутивах).
- Откройте командную строку (Win+R -> cmd).
- Перейдите в папку с sjasmplus.exe:
Bash:
cd C:\Dev\ZX\
3. Выполните команду:
Bash:
sjasmplus --version
- Если вы увидите версию ассемблера (например, v1.20.3), значит, всё установлено корректно.
Создайте структуру папок для проекта:
Часть 3: Первая программа — «Hello, Speccy!»
Создайте в папке src файл hello.asm.
Assembler Z80:
; ============================================
; hello.asm - Первая программа для SjASMPlus
; ============================================
; Устанавливаем начальный адрес загрузки для 48K Spectrum
; Программа будет располагаться с адреса 32768
org 32768
; Точка входа программы
start:
; Очищаем экран
call 0x0DAF ; Используем стандартный ROM-процедуру CLS
; Выводим сообщение в центре экрана
ld de, hello_string ; DE = адрес строки
ld bc, 0x020A ; B = строка (2), C = столбец (10) - примерно центр
call print_at
; Бесконечный цикл
loop:
jr loop
; ----------------------------
; Подпрограмма печати строки
; Вход: DE - адрес строки, терминированной 0x80
; B - строка (0..23), C - столбец (0..31)
; ----------------------------
print_at:
push bc
; Вычисляем адрес в экранной области
ld a, b
and 0x18
add a, 0x40
ld h, a
ld a, b
and 0x07
rra
rra
rra
add a, c
ld l, a
pop bc
; Выводим символы
print_loop:
ld a, (de)
or a
ret z ; Выход, если встретили 0
and 0x7F ; Убираем бит терминатора
ld (hl), a ; Кладем символ в видеобуфер
inc de
inc hl
jr print_loop
; ----------------------------
; Данные программы
; ----------------------------
hello_string:
db "Hello, ZX Spectrum!", 0
; Указываем точку входа для создания SNA-файла (опционально)
; savesna "build/hello.sna", start
; Директива для создания TAP-файла
; Она обернет наш бинарник в формат .TAP
EMPTYTAP "build/hello.tap"
; Добавляем автостартующий блок с кодом
SAVETAP "build/hello.tap", CODE, "hello", start, 32768
В командной строке перейдите в папку проекта (MySpectrumGame) и выполните:
Bash:
sjasmplus src/hello.asm --lst=build/hello.lst
- src/hello.asm — путь к исходному файлу.
- --lst=build/hello.lst — опционально, создаст листинг с адресами и кодом для отладки.
Шаг 5: Запуск
Откройте эмулятор (например, UnrealSpeccy, Fuse, ZX-Poly) и загрузите файл hello.tap. Вы должны увидеть черный экран и надпись "Hello, ZX Spectrum!".
Часть 4: Продвинутые возможности и лучшие практики
1. Использование препроцессора и инклудовРазделяйте код на модули. Создайте файл macros.inc:
Assembler Z80:
; macros.inc
MACRO WAIT_FRAMES frames
ld b, frames
wait_loop:
halt ; Ждем прерывание (1/50 сек)
djnz wait_loop
ENDM
MACRO SET_BORDER color
ld a, color
out (0xFE), a
ENDM
Код:
include "macros.inc"
SET_BORDER 2 ; Красная бордюрка
WAIT_FRAMES 50 ; Ждем 1 секунду
Используйте директивы BANK и PAGE для переключения банков:
Assembler Z80:
; Помещаем данные в банк 5 (обычно для данных)
BANK 5
music_data:
incbin "assets/music.pt3"
; Возвращаемся в банк 0 (основной)
BANK 0
main:
; Переключаемся на банк 5
ld bc, 0x7FFD
ld a, 5
out (c), a
; ... работаем с данными ...
Код:
EMPTYTRD "build/game.trd"
SAVETRD "build/game.trd", "MYGAME C", start, 32768
- Установите расширение ASM Code Lens или Z80 Macro Assembler.
- Настройте задачу сборки (.vscode/tasks.json):
JSON:
{
"version": "2.0.0",
"tasks": [
{
"label": "Build with SjASMPlus",
"type": "shell",
"command": "sjasmplus",
"args": [
"--color=on",
"--lst=${workspaceFolder}/build/${fileBasenameNoExtension}.lst",
"--sym=${workspaceFolder}/build/${fileBasenameNoExtension}.sym",
"${file}",
"--exp=${workspaceFolder}/build/${fileBasenameNoExtension}.exp"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}
Часть 5: Частые ошибки и их решение
- Error: unknown instruction
- Проверьте регистры (нельзя ld bc, hl). Сверьтесь со справочником команд Z80.
- Программа в эмуляторе зависает или ведет себя странно
- Используйте отладчик эмулятора (например, в UnrealSpeccy F11). Установите брейкпоинт на start и пройдитесь по шагам.
- Проверьте, не затираете ли вы стек или важные области памяти.
- SjASMPlus не видит инклуд-файлы
- Используйте абсолютные пути или укажите папку для поиска через опцию -I:
Bash:
sjasmplus -I./src -I./assets src/main.asm
- Большой проект собирается медленно
- Используйте --nologo и собирайте только измененные файлы через скрипты.
Часть 6: Полезные ссылки и следующий шаг
- Официальная документация: https://github.com/z00m128/sjasmplus/blob/master/docs/ — читайте обязательно!
- Примеры проектов: Изучите исходники современных демок и игр на https://spectrumcomputing.co.uk/ или на ZX Modules.
- Следующий шаг: Попробуйте собрать проект из нескольких файлов, подключить музыку в формате PT3 (используя AY-3-8910 эмулятор) и спрайты.
«[GUIDE] Современный стек разработки под ZX Spectrum: SjASMPlus + VS Code + Git»
В теме можно делиться своими конфигами, скриптами автоматизации, задавать вопросы по тонкой настройке и обсуждать best practices для больших проектов.
Удачи в программировании!
- Уровень сложности
- Средний
- Язык программирования
- Ассебмлер
- Требования к памяти
- 48 К
- Совместимость
- Spectrun