codelens_usage.gif

💡 ВСТУПЛЕНИЕ: ПРОБЛЕМА, О КОТОРОЙ ВЫ НЕ ЗНАЛИ, ПОКА ОНА НЕ РЕШЕНА

Представьте ситуацию: вы пишете на C для MSX или ZX Spectrum Next, используя мощный компилятор SDCC (Small Device C Compiler). Вам нужно вставить быстрый ассемблерный код — может быть, для критического по времени участка или для доступа к специфическим возможностям железа. Вы открываете файл .s или .asm, а там... серый монотонный текст. Ни подсветки, ни автодополнения, ни проверки синтаксиса. VS Code думает, что это какой-то неизвестный язык.

Знакомо? Это проблема, с которой сталкиваются все, кто использует ассемблер asz80 — стандартный ассемблер для SDCC, унаследованный от древнего ASxxxx .

И тут на помощь приходит расширение ASxxxx Cross Assembler and Linker (и его аналоги), которое добавляет в VS Code поддержку синтаксиса asz80 . Это не просто подсветка — это мостик между миром SDCC и современным редактором.


🏗️ ЧТО ТАКОЕ ASZ80 И ASXXXX?

Прежде чем говорить о поддержке в VS Code, нужно понять, что такое asz80 и откуда он взялся.

ASxxxx — это семейство кросс-ассемблеров с открытым исходным кодом, созданное Аланом Болдуином. В марте 2021 года оно было открыто под лицензией GPL . В это семейство входят ассемблеры для разных архитектур, и asz80 — это вариант для процессора Z80 .

SDCC использует sdasz80 — форк оригинального ASxxxx, который со временем разошёлся с основной веткой . Но синтаксис остался очень близким, и в сообществе (особенно в MSX-разработке) его часто называют просто "asz80 syntax" .

Где используется asz80:

ПлатформаПрименение
MSXОсновной ассемблер для SDCC при разработке под MSX
ZX Spectrum NextПоддержка расширений .zxn и .ez80
Другие Z80-системыВезде, где используется SDCC с ассемблерными вставками

🧬 ЧТО ТАКОЕ "ASZ80 SUPPORT" В КОНТЕКСТЕ VS CODE?

Когда мы говорим о "поддержке asz80" в VS Code, мы имеем в виду не один конкретный плагин, а несколько расширений, которые добавляют подсветку синтаксиса для этого диалекта ассемблера. Главное из них — "ASxxxx Cross Assembler and Linker" от разработчика clcxce .

🎯 КЛЮЧЕВЫЕ ВОЗМОЖНОСТИ

  1. Подсветка синтаксиса asz80 — все команды Z80, директивы ассемблера, метки и комментарии становятся цветными .
  2. Поддержка расширенных инструкций — в том числе undocumented-инструкций IXl, IXh, IYl, IYh, которые так важны для оптимизации .
  3. Поддержка новых форматов — .zxn для ZX Spectrum Next, .ez80 для eZ80 .
  4. Автоматическое распознавание файлов — для расширений .asm и .s можно настроить ассоциацию с языком asz80 .
  5. Интеграция с MSX Game Library — официально рекомендуется для разработки игр под MSX .

⚙️ УСТАНОВКА И НАСТРОЙКА: ТРИ ПРОСТЫХ ШАГА

📥 Шаг 1: Установка расширения

  1. Запустите Visual Studio Code.
  2. Нажмите Ctrl+Shift+X (или иконку квадратиков слева), чтобы открыть вкладку Extensions.
  3. В поиске введите "ASxxxx Cross Assembler".
  4. Найдите расширение от автора clcxce и нажмите Install .

🔧 Шаг 2: Настройка ассоциаций файлов

Расширение само по себе добавляет поддержку языка, но VS Code нужно "объяснить", что файлы с определёнными расширениями должны обрабатываться как asz80.

Откройте настройки VS Code (File -> Preferences -> Settings или Ctrl+,) и добавьте следующие ассоциации :
JSON:
"files.associations": {
    "*.asm": "asz80",
    "*.s": "asz80"
}

Важно: Это можно сделать как в глобальных настройках, так и в настройках конкретного проекта (в папке .vscode), если вы хотите сохранить конфигурацию в репозитории.

🧪 Шаг 3: Проверка

Создайте файл test.asm с таким содержимым:
Assembler Z80:
; Пример кода на asz80
    .area _CODE
    .globl _main

_main:
    ld hl, #_message
    call _print
    ret

_message:
    .ascii "Hello, MSX!\0"

Если всё настроено правильно, вы увидите цветную подсветку: синие команды, зелёные комментарии, жёлтые директивы, оранжевые метки.


🚀 РАБОЧИЙ ПРОЦЕСС (ИНТЕГРАЦИЯ С SDCC)

Типичный сценарий: C + ассемблер в проекте под MSX​

Структура проекта:
Код:
MyMSXProject/
├── src/
│   ├── main.c              # Основной код на C
│   ├── video.asm           # Ассемблерные процедуры для видео
│   └── math.asm            # Быстрые математические функции
├── .vscode/
│   └── settings.json       # Ассоциации файлов
└── Makefile                 # Сборка через SDCC

Пример main.c:
C:
#include <stdio.h>

// Внешние ассемблерные функции
extern void fast_copy(unsigned char* src, unsigned char* dst, int len);
extern int fast_sqrt(int value);

int main(void) {
    unsigned char buffer[256];
    fast_copy(buffer, (unsigned char*)0x8000, 256);
    int root = fast_sqrt(12345);
    return 0;
}

Пример video.asm (с подсветкой asz80):
Assembler Z80:
    .area _CODE
    .globl _fast_copy

_fast_copy:
    ; HL = src, DE = dst, BC = len (параметры из C)
    ld hl, #2
    add hl, sp
    ld e, (hl)
    inc hl
    ld d, (hl)  ; DE = src
    inc hl
    ld a, (hl)
    inc hl
    ld h, (hl)
    ld l, a     ; HL = dst
    ex de, hl   ; Теперь HL = src, DE = dst
    pop bc      ; BC = len (из стека)
    ldir        ; Блочное копирование
    ret

Благодаря расширению, файл video.asm будет отображаться с полноценной подсветкой, что делает работу с ассемблерными вставками такой же комфортной, как и с C-кодом.


🧠 ПРОДВИНУТЫЕ ВОЗМОЖНОСТИ ASZ80

🆕 Новые директивы в SDCC 4.3.0

Начиная с версии SDCC 4.3.0, в asz80 появились важные улучшения :
ДирективаНазначение
.allow_undocumentedРазрешает использование undocumented-инструкций (IXl, IXh, IYl, IYh)
--allow-undocumented-instructionsОпция компилятора для генерации undocumented-кода из C

Пример использования undocumented-инструкций:
Assembler Z80:
    .allow_undocumented
    ld a, ixh      ; Раньше это вызывало ошибку, теперь работает
    ld b, iyl      ; Экономит байты и такты

Это особенно важно для разработчиков под MSX и ZX Spectrum Next, где каждый такт на счету .

🧩 Поддержка ZX Spectrum Next

asz80 поддерживает расширенные инструкции для ZX Spectrum Next через директиву .zxn :
Assembler Z80:
    .zxn
    mul de         ; Умножение (специфично для Next)
    swapnib        ; Обмен полубайтами
    pixelad        ; Адрес пикселя

🔧 Интеграция с Z80 Assembly Meter

Для полного счастья можно добавить расширение Z80 Assembly Meter от theNestruo, которое показывает количество тактов и байтов для asz80-кода . В настройках нужно добавить asz80 в список языков:
JSON:
"z80-asm-meter.languageIds": ["asz80", "c"]

Это позволит видеть стоимость ассемблерных вставок прямо в редакторе.


📊 СРАВНЕНИЕ: РАСШИРЕНИЯ ДЛЯ ASZ80


РасширениеАвторОсновные фичиКогда использовать
ASxxxx Cross AssemblerclcxceПодсветка asz80, поддержка ASxxxxОсновной выбор для asz80
ASM Code LensmaziacCode lens, переход к определению, поиск ссылокЕсли нужен анализ кода, а не только подсветка
Z80 Macro-AssemblermborikПодсветка Z80, автодополнениеЕсли пишете на sjasmplus, но asz80 тоже понимает (частично)

🎨 ПЛЮСЫ И МИНУСЫ

✅ Плюсы (Почему это нужно каждому MSX/Next-разработчику)

  • Критически важно для SDCC: asz80 — стандартный ассемблер для SDCC, и без подсветки работать с ним невыносимо .
  • Поддержка новых возможностей: undocumented-инструкции, Z80N, eZ80 — всё это подсвечивается корректно .
  • Простота настройки: установил расширение, прописал две строчки в настройках — и всё работает .
  • Интеграция с экосистемой: работает вместе с Z80 Assembly Meter, DeZog и другими инструментами .
  • Открытый исходный код: можно посмотреть, как работает, и даже поучаствовать в разработке .

❌ Минусы (О чём нужно знать)

  • Только подсветка: расширение не добавляет автодополнение, проверку синтаксиса или переход к определению. Для этого нужны другие инструменты .
  • Ограниченная поддержка строк: строки, ограниченные апострофами (например, 'Hello'), могут не подсвечиваться корректно .
  • Узкая ниша: нужно только тем, кто использует SDCC и asz80. Если вы пишете на sjasmplus под Spectrum, это расширение вам не нужно.
  • Зависимость от версии SDCC: новые директивы (вроде .allow_undocumented) появляются в asz80 постепенно, и расширение должно за ними успевать .

🧪 СОВЕТЫ БЫВАЛОГО (ОПТИМИЗАЦИЯ РАБОТЫ)

  1. Используйте workspace settings. Не прописывайте ассоциации глобально — положите их в .vscode/settings.json вашего проекта. Тогда при клонировании репозитория у всех будет одинаковая конфигурация .
  2. Комбинируйте с ASM Code Lens. Если вам нужно не только видеть цветной код, но и анализировать его (переход к определению, поиск ссылок), добавьте расширение ASM Code Lens от maziac .
  3. Для MSX укажите правильную платформу в Z80 Assembly Meter. В настройках метра выберите "MSX", чтобы такты считались с учётом wait states .
  4. Следите за обновлениями SDCC. В версии 4.3.0 были проблемы с генерацией undocumented-инструкций даже без запроса, но в 4.4.0 это исправили .
  5. Проверяйте совместимость. Если вы используете несколько расширений для ассемблера, убедитесь, что они не конфликтуют за язык файла. VS Code может ассоциировать файл только с одним языком .

📚 РЕСУРСЫ И ССЫЛКИ

  • ASxxxx Cross Assembler and Linker на Visual Studio Marketplace: ссылка
  • Документация SDCC по ассемблерам: ссылка
  • MSX Game Library: Рекомендации по VS Code: ссылка
  • ASM Code Lens на Visual Studio Marketplace: ссылка

📖 ЗАКЛЮЧЕНИЕ: НЕВИДИМЫЙ, НО НЕЗАМЕНИМЫЙ

ASZ80 Support (в лице расширения ASxxxx Cross Assembler and Linker) — это пример идеального инструмента, который делает ровно одну вещь, но делает её хорошо.

Он не пытается заменить ассемблер, отладчик или компилятор. Он просто даёт вам визуальную обратную связь при работе с asz80-кодом, превращая серый монотонный текст в структурированный, легко читаемый код с цветовым кодированием.

Для разработчиков под MSX, использующих SDCC, это расширение должно быть в списке обязательных к установке сразу после самого VS Code . Без него работа с ассемблерными вставками превращается в угадайку: "А это директива или команда? А здесь я не закрыл строку? А этот символ что означает?"

С ним вы просто видите код и можете сосредоточиться на главном — создании быстрых и эффективных программ для любимых ретро-платформ.


P.S. Если вы разрабатываете под MSX, загляните в документацию MSX Game Library — там есть отличные рекомендации по настройке всего стека инструментов, включая это расширение .

P.P.S. Автору расширения, clcxce, спасибо за поддержку ASxxxx. Иногда самые простые инструменты приносят больше всего пользы.