Делаем связку Notepad++ + SjASMPlus + UnrealSpeccy
Итак, нам надо подружить Notepad++ с ассемблером и эмулятором, дабы удобно редактировать исходные коды и прямо из него, никуда не выходя, компилировать их и запускать результат через эмулятор.
Сначала пару слов о том, почему именно Notepad++:
- Бесплатность.
- Поддержка одновременной работы с несколькими файлами.
- Настраиваемая подсветка синтаксиса.
- Возможность настройки сворачивания кода / комментариев.
- Поддержка проектов.
- Множество всевозможных плагинов (с некоторыми из которых нам предстоит познакомиться).
- Просто нравится (привык я к нему).
Начнем. Установка Notepad++
Тут все просто.
- Отправляемся на https://notepad-plus-plus.org/.
- Жмем там Download, выбираем нужный нам вариант (есть инсталлятор, zip-архив, 7z-архив, а также особый сверхмалый 7z-архив, откуда вырезано все лишнее), скачиваем. Я обычно выбираю просто инсталлятор.
- Ставим Notepad++ через инсталлятор или распаковываем в нужное место из архива, смотря что выбрали пунктом выше. Тут, я думаю, вопросов возникнуть не должно никак.
- Есть только одна мелочь, если выбрали инсталлятор, во время установки, на странице выбора компонентов устанавливаемой программы не забудьте выбрать русскую локализацию в категории "Localization".
- И обратите внимание на следующую страницу в инсталляторе. Если вы хотите иметь возможность таскать с собой Notepad++ на флэшке, запретите ему хранить настройки в %APPDATA%, установив первую галочку на этой странице. Вторую галочку я обычно не устанавливаю. Третья (ярлык на рабочем столе) и четвертая (использование старой иконки программы) - на ваш выбор.
- Все.
Настройка подсветки кода ассемблера Z80 и сворачивания блоков
Итак, Notepad++ установлен, однако если открыть исходный файл ассемблера Z80, то никакой подсветки мы там не увидим, ибо встроенной подсветки для нашего асма там попросту нет. Не нашел я ее и в тех, что можно скачать с официального сайта (может быть просто плохо искал). Но выход есть. Во-первых, в Notepad++ есть возможность создания своего синтаксиса. Однако, это несколько утомительно. Но вам повезло!:) Ибо (мне-то деваться было некуда) я слепил за ночь такую подсветку (точнее просто взял готовую от другого редактора и вбил то, что там было в меню Notepad++). Сразу оговорюсь, то, что получилось в итоге, от идеала очень далеко, но уже лучше, чем совсем ничего. Дальше расскажу, как ее подключить.
- Копируем файлик z80.xml в ту папку, в которую мы установили (распаковали) Notepad++.
- Запускаем Notepad++.
- Идем в меню "Синтаксисы -> Задать свой синтаксис".
- В открывшемся диалоге жмем кнопку "Импортировать", выбираем наш файл (z80.xml)
- Получаем сообщение об успешном импорте. Теперь можно здесь же в списке "Пользовательский язык" выбрать "Z80 Assembler".
Обратите внимание на то, что установилась галочка "Любой регистр" (ключевые слова будут подсвечиваться независимо от того, в каком регистре набраны) и в поле "Расширение" появилось расширение "a80" (именно его принято использоваться для исходных текстов ассемблера Z80, по крайней мере не один я его использую). В принципе, с подсветкой все. В этом диалоге при желании потом можно покопаться и изменить подсветку по вашему вкусу. - Еще одно замечание. Для файлов с расширением "a80" подсветка должна теперь включаться автоматически. Для файлов же с другим расширением эту подсветку можно подключить, выбрав ее в самом низу меню "Синтаксисы" (появится только после перезапуска Notepad++).
Теперь немного небольшого оффтопа. Когда я пилил эту подсветку, мне очень хотелось иметь возможность сворачивать произвольные блоки кода (не только многострочные комментарии). Возможность такая в Notepad++ имеется. Однако надо было придумать какие-то маркеры начала и конца блока, а так как была уже глубокая ночь, то ничего хорошего мне в голову не пришло. Поэтому, я считаю, что я просто обязан вам рассказать, как эти маркеры (теги) поменять на более удобные или осмысленные.
Для начала расскажу как работает эта фича Notepad++. В SjASMPlus, которым мы будем пользоваться в качестве ассемблера, есть два типа комментариев: многострочные (задаются парами символов /* и */ в начале и в конце комментария) и однострочные (задаются символами ; или //, кому как удобно). С многострочными все понятно, они имеют возможность сворачиваться по умолчанию, сразу же как только были заданны в подсветке. Однако то, что расположено внутри многострочного комментария - это всего лишь комментарий, а нам надо научиться сворачивать код. И вот с помощью однострочных комментариев можно именно этого и добиться. Для этого нам надо задать особые маркеры начала и конца блока. И вот как это будет выглядеть:
какой-то код ; какой-то комментарий МАРКЕР_НАЧАЛА_БЛОКА какой-нибудь еще комментарий какой-то код и еще какой-то код ; какой-то комментарий (или нет его не важно) МАРКЕР_КОНЦА_БЛОКА какой-то еще код
Так вот те строки, где располагаются маркеры начала и конца блока, для ассемблера по сути обычные однострочные комментарии, код расположенный между ними ассемблируется, как обычный код. Но наличие этих пар (можно настроить тройки) маркеров, позволяют сворачивать блок.
Теперь о том, где это настроить. Ибо я для начала и конца блока выбрал ---> и <---, что вряд ли удобно.
- Идем в меню "Синтаксисы -> Задать свой синтаксис".
- Выбираем наш "Z80 Assembler".
- И тут же на первой вкладке "Стандартный", в группе "Свертывание в комментариях" задаем удобные нам маркеры. Их может быть несколько разных (указываются через пробел), но обязательно с соблюдением порядка. Маркер "Середина" - это что-то наподобие ELSE в IF...ELSE...ENDIF.
Во всем остальном подсветка вполне рабочая.
Далее. Дружим Notepad++ с SjASMPlus и UnrealSpeccy
Что ж, подсветка - это конечно хорошо, однако мы сюда не на раскрашенные исходники смотреть пришли. Пора уже прикручивать наш редактор к ассемблеру и эмулятору.
Сам по себе Notepad++ умеет запускать по клавише F5 сторонние программы с нужными параметрами, но этого маловато, ибо хотелось бы, чтобы и клавиш было побольше (одну на ассемблирование, другую на запуск, третью на ассемблирование и сразу запуск). Да и хотелось бы видеть, что там нам в консоль ассемблер написал, а тут его окошко так быстро исчезает, что этого никак не успеть. Можно было бы пару bat-файлов написать, конечно, ждущих нажатия паузы. Но мы пойдем другим путем. И вот каким.
- Для начала идем по адресу: https://sourceforge.net/projects/npp-plugins/files/NppExec/ и скачиваем оттуда плагин NppExec. Можно его установить и из меню Notepad++, но мы скачаем так (а то что-то у меня скачка плагинов изнутри Notepad++ барахлит). Скачиваем оттуда последнюю версию NppExec Plugin. Там есть ANSI и Unicode версии. Насколько я понял, ANSI предназначается для старых версий Notepad++, которые работают на ОС без поддержки Юникода (типа Windows 98). Поэтому качаем Unicode-версию плагина.
- Скачали, распаковываем архив с плагином в папку с установленным Notepad++ в подпапку "plugins".
- Запускаем (перезапускаем) Notepad++. В Меню "Плагины" должен появиться пункт "NppExec", а на панели инструментов кнопка "Show Console Dialog".
- Жмем эту кнопку, появится окно консоли. В нем мы будем видеть все сообщения от наших ассемблера и эмулятора. Однако их запуск нам предстоит еще настроить.
- Для этого мы напишем три простых скрипта. Первый будет компилировать проект с помощью SjASMPlus, второй запускать полученный образ диска в UnrealSpeccy, третий делать первое и второе подряд.
- Начнем с первого. Идем в меню "Плагины -> NppExec -> Execute...". Откроется диалог, в котором можно набрать небольшой скрип и тут же его запустить. Мы его пока запускать не будем, но наберем следующий скрипт:
Последняя строка скрипта как раз и отправляет наш проект на компиляцию. ВАЖНО! На компиляцию отправляется тот исходник, который открыт в первой вкладке (это можно изменить, чтобы на компиляцию отправлялся текущий редактируемый файл, но так как у меня проекты обычно состоят из многих файлов и одного основного, мне так удобнее). Перед этим происходит попытка сохранения всех не сохраненных файлов и переключение на первую вкладку.
// Скрипт компиляции проекта // сохраняем все файлы npp_saveall // переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!) npp_switch $(#1) // меняем рабочую директорию cd $(CURRENT_DIRECTORY) // компилируем проект "<Полный путь к SjASMPlus>\sjasmplus.exe" --fullpath --sym="$(NAME_PART).sym" "$(FILE_NAME)"
- Скрипт готов. Теперь логично его сохранить. Жмем "Save". Вводим имя нашего первого скрипта, например, z80complie. Снова жмем "Save". Можно идти настраивать дальше, но бы лучше сразу сохраним и два других скрипта.
- Выберем в списке
, окошко очистится, и мы наберем в нем следующее: Здесь все аналогично первому скрипту.// Скрипт запуска проекта // переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!) npp_switch $(#1) // меняем рабочую директорию cd $(CURRENT_DIRECTORY) // запускаем откомпилированный проект "<Полный путь к UnrealSpeccy>\unreal.exe" "$(NAME_PART).trd"
- Аналогично п.7 сохраним сей скрипт под именем z80run
- Действуя, как в п.8, наберем скрипт "Сохранение+Запуск"
Тут все еще понятнее, это по сути просто два предыдущих скрипта вместе.
// Скрипт компиляции и запуска проекта // сохраняем все файлы npp_saveall // переключаемся на основной файл проекта (должен быть открыт в 1-ой вкладке!) npp_switch $(#1) // меняем рабочую директорию cd $(CURRENT_DIRECTORY) // компилируем проект "<Полный путь к SjASMPlus>\sjasmplus.exe" --fullpath --sym="$(NAME_PART).sym" "$(FILE_NAME)" // запускаем откомпилированный проект "<Полный путь к UnrealSpeccy>\unreal.exe" "$(NAME_PART).trd"
- Сохраним скрипт под именем z80complie_run.
- Скрипты готовы, теперь хотелось бы, чтобы они были под рукой. Для чего идем в меню "Плагины -> NppExec -> Advanced Options...".
- В группе "Menu items" устанавливаем галочку на "Place to the Macros submenu".
- Ниже в группе "Menu item", вводим имена пунктам меню и выбираем скрипты, которые они буду запускать. Например, в "Item name" введем "Компиляция Z80", в списке "Associated script" выберем "z80compile". Не забудем нажать кнопку "Add/Modify". Добавленный пункт появится в списке сверху. После создания пунктов меню для всех наших трех скриптов, их порядок расположения можно поменять кнопками "Move Up" и "Move down". Закрываем этот диалог. Notepad++ сообщит о необходимости перезапуска. Что ж, перезапустите его. Теперь в меню "Макросы" появились наши макросы. Но, кажется, я что-то говорил о горячих клавишах. Действуем дальше.
- Идем в меню "Опции -> Горячие клавиши...". На вкладке "Plugin commands" ищем наши Макросы, жмем "Modify" или кликаем 2 раза по строке с макросом, задаем горячую клавишу. Я задал клавиши F9, F10 и Shift+F10 для всех трех макросов.
Итак с макросами-скриптами готово, теперь можно сваять какой-нибудь простенький проект и попробовать все в действии. Можно видеть, как при компиляции в окне консоли внизу SjASMPlus выдает нам ошибки, указывая имя файла и строку, но как же не удобно искать их в куче файлов проекта. Но и тут есть выход. Далее об этом.
Настройках переходов на ошибки из консоли
Приступим...
- Все просто. Меню "Плагины -> NppExec -> Console Output Filters...". На вкладке "Highlight" задаем следующую маску "%F%(%L%): error:*". Устанавливаем галочку для нее. А также цвет (например красный) и стиль шрифта. Жмем "OK". Снова пытаемся откомпилировать наш исходник с ошибкой. Замечаем, что строки с ошибками теперь выделены выбранным цветом. Попробуйте два раза щелкнуть по ней мышью. Удобно.
Панель меток
Теперь еще для полноты картины неплохо было заставить Notepad++ искать метки в открытых документах и выводить их в отдельной колоночке. Есть у Notepad++ такая фича, как отображение списка функций. Ее-то мы для этого и настроим.
- Для этого нам надо открыть на редактирование файл "functionList.xml" из папки с установленным Notepad++.
- Найти секцию <parsers> и запихать туда свой парсер следующего вида:
Немного объясню, что тут к чему. В первой строке мы задаем идентификатор нашему парсеру (должен быть уникальным), имя ему (которое где-то должно отображаться, судя по названию) и (самое главное) регулярное выражение описывающие синтаксис комментариев нашего языка, для того, чтобы комментарии пропускались при поиске меток. Сразу оговорюсь, я совершенно не умею составлять регулярные выражения, поэтому я кое-как добился, чтобы работало, и этим доволен. В строке (или как это зовется в xml) "function" задается регулярное выражение для поиска строк (или как у меня, кусков строк) с метками - mainExpr и формат отображения найденных меток в списке. В секции "functionName" указывается еще одно регулярное выражение, извлекающее из найденных строк имена меток (в строке "nameExpr").
<parser id="z80_label" displayName="Z80 Assembler labels" commentExpr="((/\*.*?\*)/|(//.*?$)|(;.*?$))"> <function mainExpr="(^[\S]+)" displayMode="$functionName"> <functionName> <nameExpr expr="(^\S+)"/> </functionName> </function> </parser>
- Парсер готов, но это еще не все. Теперь идем вверх по файлу, находим секцию "associationMap" и прописываем туда наш парсер следующим образом:
где, "userDefinedLangName" имя нашего синтаксиса (должно быть таким же, как и при редактировании подсветки), а "id" - идентификатор нашего парсера.
<association userDefinedLangName="Z80 Assembler" id="z80_label"/>
Либо можно сделать привязку по расширению так:<association ext=".a80" id="z80_label"/>
- Файл сохраняем.
- Перезапускаем Notepad++, идем в меню "Вид -> Список функций". Любуемся нашими метками справа от текста. Теперь, кликая дважды по их именам, можно быстро переходить к их объявлению в тексте.
Ну вот, в общем-то и все, что я хотел написать, рассказать.
Спасибо за внимание.