Sega Master System 01: Окружение

Каждая статья, курс или книга обучающая разработке начинается с настройки окружения. Это может показаться жутко скучным и даже убивающим энтузиазм, но поверьте это не совсем так. Окружение - это наши инструменты, и они должны быть как минимум в удовлетворительном состоянии перед началом любого дела. Много ли сможет сделать радиолюбитель без паяльника? Человек со смекалкой может воспользоваться хоть утюгом, но понравится ли ему паять утюгом? Думаю, что не очень. Так же и у нас. Если не подготовить среду разработки, то сложности которые будет вызывать её отсутствие, очень быстро убьют желание всем этим заниматься.

Первое с чем надо определиться это операционная система. Я пользуюсь одной из самых популярных на сегодняшний день версий Linux - Debian/Ubuntu/Mint. Если у вас MacOS X или Windows, то некоторые детали окружения могут отличаться, но эти отличия некритичны. Описываемые мной действия могут быть переработаны под ваши предпочтения.

В первую очередь нам понадобятся три самых главных инструмента:

  1. Текстовый редактор с подсветкой синтаксиса, в котором мы будем писать наши программы.
  2. Ассемблер, который будет преобразовывать наш код в исполняемый код для SMS и запаковывать его в виде rom'а.
  3. Эмулятор на котором мы будем запускать rom полученный из ассемблера. Крайне желательно чтобы эмулятор был со встроенным отладчиком.

Необязательные инструменты, но при их наличие вам очень сильно облегчит жизнь.

  1. Средства автоматизации сборки. Вы можете и вручную запускать все команды сборки, запускать эмулятор выбирать в нём получившийся файл и тд. Но сомневаюсь что вам это понравится. Мы будем стараться автоматизировать всё по максимуму, потому что "Машины должны работать, а люди думать"
  2. Графический редактор. Думаю никто не будет спорить с тем, что рисовать графику проще в графическом редакторе, по крайней мере в большинстве случаев.
  3. Система контроля версий. Система контроля версий может поначалу показаться чем-то сложным и запутанным, но когда распробуете, то будете удивляться как раньше без неё вообще жили. И даже начнёте применять её не совсем по назначению =) Например этот блог живёт в такой системе. Подробности ниже.

Ещё в нам понадобятся инструменты для работы со звуками и музыкой. Но о них мы поговорим когда непосредственно коснёмся этой темы. Настройка первоначального окружения и так уже получается немаленькой.

1. Текстовый редактор

В текстовом редакторе мы будем проводить очень много времени. Так что если у вас есть опыт программирования, то я советую вам выбрать наиболее удобный текстовый редактор лично для вас. Однако если вы хотите в точности воспроизвести моё окружение, то берите Sublime Text 3, я пользуюсь именно им. Если по тем или иным причинам он вам не подходит, то обратите внимание на Notepad++ или Geany.

Sublime Text 3 не поддерживает по умолчанию подсветку синтаксиса для нужного нам ассемблера, поэтому пришлось написать собственный файл подсветки и до кучи цветовую тему. Взять их можно здесь https://github.com/w0rm49/wla-dx-syntax . Для установки достаточно скопировать эти два файла в папку с пользовательскими пакетами. Вот где находится эта папка в различных ОС:

  • Windows %APPDATA%\Sublime Text 3\Packages\User
  • MacOS X ~/Library/Application Support/Sublime Text 3/Packages/User
  • Linux ~/.config/sublime-text-3/Packages/User

Подсветка синтаксиса максимально простая, без каких-либо глубоких семантик. Если вы хотите её дополнить или исправить - добро пожаловать на гитхаб, где эти файлы и будут жить. Если вы выбрали другой редактор, то я, по мере возможностей, могу вам помочь с настройкой и добавлю сюда инструкцию и по вашему редактору.

2. Ассемблер

В этой обучающей серии используется ассемблер WLA DX. Помимо необходимой архитектуры Z80 он умеет работать и с другими архитектурами: 6502, 65C02, 6510, 65816, GB-Z80, HuC6280, SPC-700. Так что если планируете что-то писать под nes/snes, pc-engine, game boy а так же всякие комодоры и спектрумы, то он вам и здесь поможет. Помимо того что он может выдавать код для такого количества архитектур, он ещё и сам работает в большом количестве операционных систем, помимо большой тройки windows/macos/linux он способен работать даже под ms-dos и amiga os.

Скачать его можно на официальной странице http://www.villehelin.com/wla.html или на гитхабе https://github.com/vhelin/wla-dx

Стоит сразу отметить терминологическую путаницу которая часто возникает в этом месте.

  • Ассемблер (англ. assembler) - это программа-транслятор текста программы в машинный код
  • Язык ассемблера (англ. assembly language) - это язык программирования на котором мы будем в дальнейшем писать наши программы.

Однако часто Язык ассемблера называют просто "ассемблер", что технически неверно, но так уж повелось, поэтому будьте внимательны и следите за тем в каком контексте употребляется слово "ассемблер", потому что оно может обозначать и язык и саму программу-транслятор.

Установка.

Скачайте WLA DX с официального сайта или из официального репозитория и распакуйте в папку на жестком диске которую сочтёте наиболее подходящей для этих целей. Например в ~/sms_dev/tools/wldadx/

Для сборки WLA DX необходим cmake, если него нет в вашей системе, то надо его установить. Затем нужно перейти в папку в которую вы его распаковали и сгенерировать сценарии сборки, а потом наконец-то запустить саму сборку. Вот последовательность всех команд:

sudo apt-get install cmake
cd ~/sms_dev/tools/wladx/
cmake -G "Unix Makefiles"
make

После компиляции исполняемые файлы будут находиться в папке ~/sms/tools/wladx/binaries/ нам понадобятся wla-z80 и wlalink

Ссылки:

Зеркала:

3. Эмулятор

Для запуска всего что мы собираемся делать понадобится эмулятор и желательно с отладчиком. Насколько мне известно эмулятор MEKA имеет самый "развесистый"" отладчик на данный момент. На официальном сайте этого эмулятора с 2010 года нет обновлений. Но не стоит отчаиваться, продолжением разработки этого эмулятора теперь занимаются на форуме SMS Power. Там же можно скачать уже готовые сборки под windows. На всякий случай я размещу у себя копию самой свежей на данный момент сборки.

Установка

Теперь приступим к сборке linux версии. Этот эмулятор построен на базе библиотеки Allegro, поэтому для начала поставим в систему заголовочные файлы этой библиотеки и её дополнительных пакетов используемых в этом эмуляторе.

sudo apt-get install liballegro5-dev liballegro-audio5-dev liballegro-ttf5-dev liballegro-image5-dev

Небольшое примечание: На момент написания в репозитории находилась библиотека allegro версии 5.0, но самая свежая 5.2, но 5.2 находилась в отдельном PPA-репозитории и не имела некоторых дополнительных пакетов. Однако со стандартной версией 5.0 эмулятор прекрасно собирается и работает.

Теперь надо скачать или склонировать исходники эмулятора. Разместим недалеко от ассемблера. В моём случае в ~/sms_dev/tools/meka/ и сразу переходим в неё, переходим в подпапку srcs и запускаем сборку

cd srcs
make exe

После сборки в папке эмулятора появится исполняемый файл meka, если он есть и сборка прошла успешно надо убрать оставшиеся объектные файлы командой

make clean_all

Готово.

Ссылки:

Зеркала:

4. Средства автоматизации сборки.

Мы уже собрали и настроили основные инструменты необходимые для начала разработки игр под SMS. Однако в таком виде это требует слишком много лишних действий. Судите сами. Вот вы отредактировали файл и хотите посмотреть на изменения в эмуляторе. Вы сохраняете файл, переключаетесь в терминал, вводите команду сборки объектного файла, команду преобразования объектного файла в корректный ром. Запускаете эмулятор и открываете в нём ром. Звучит удручающе. Поэтому немедленно приступим к автоматизации всего этого процесса.

Для автоматизации я буду использовать специальную утилиту make предназначенную как раз для подобных целей. Данная утилита работает со специальными файлами, которые называются Makefile в которых описаны автоматизируемые сценарии. Сценарии будут довольно простыми, так что их без особого труда можно будет повторить средствами bat/cmd в windows. Не буду останавливаться подробно на разборе синтаксиса этих файлов, сеть полна этими описаниями на любых существующих языка. Вот такой файл получился у меня:

#Пеменяйте пути к папкам в которых 
#у вас находятся исполняемые файлы ассемблера и эмулятор
WLA_DX_PATH  = $(HOME)/sms_dev/tools/wladx/binaries
MEKA_PATH    = $(HOME)/sms_dev/tools/meka
export PATH := $(PATH):$(WLA_DX_PATH):$(MEKA_PATH)

MAIN_FILE    = hello_world
PROJECT_DIR  = $(realpath $(dir $(realpath $(firstword $(MAKEFILE_LIST))))/../)
BUILD_DIR    = $(PROJECT_DIR)/build
SRC_DIR      = $(PROJECT_DIR)/src

build: $(MAIN_FILE).sms

$(MAIN_FILE).o:
    cd $(BUILD_DIR) && wla-z80 -o $(MAIN_FILE).o -I $(SRC_DIR) $(SRC_DIR)/$(MAIN_FILE).asm

$(MAIN_FILE).sms: $(MAIN_FILE).o
    cd $(BUILD_DIR) && echo "[objects]\n$(MAIN_FILE).o" > $(MAIN_FILE).link
    cd $(BUILD_DIR) && wlalink -i -r -v  $(MAIN_FILE).link $(MAIN_FILE).sms

run: $(MAIN_FILE).sms
    cd $(BUILD_DIR) && $(MEKA_PATH)/meka $(MAIN_FILE).sms

clean:
    cd $(BUILD_DIR) && rm -f *.o *.sms *.link

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

  • make build - собирает ром
  • make clean - удаляет все объектные файлы и собраные ромы
  • make run - собирает ром если это необхобимо и запускает его эмуляторе

Можно запускать несколько команд последовательно, например make clean run

Не стоит рассматривать этот вариант сборки как окончательный. Далее по необходимости мы будем в него добавлять больше правил сборки для таких операций как автоматическое конвертирование графики, звуков и прочее.

Осталось создать проект в Sublime Text и привязать нужные команды к горячим клавишам. В этом редакторе почти все настройки делаются при помощи редактирования конфигурационных файлов. Мы просто создадим файл проекта и впишем в него наши команды в раздел build_systems. Вот так выглядит мой файл проекта.

{
    "folders":
    [
        {
            "path": "."
        }
    ],
    "build_systems":
    [
        {
            "name": "clean run",
            "shell_cmd": "cd ${project_path}/build && make clean run"
        },
    ]
}

После создания нового проекта достаточно будет в главном меню выбрать Tools -> Build Systems -> clean run и наш проект будет автоматически собираться и запускаться по горячей клавише Ctrl+B

Скачать шаблон проекта можно здесь https://github.com/w0rm49/sms-hello-world/releases/tag/sms-01

5. Графический редактор.

Графический редактор. При этом словосочетании многим приходит в голову Adobe Photoshop или MS Paint. Не возьмусь судить хорошие это или плохие редакторы, но всё же замечу то в нашей ситуации эти лидеры народных хит-парадов нам не совсем подходят. Вообще если вы являетесь признанным мастером какого-то из графических редакторов, то конечно пользуйтесь им. Я встречал в сети много разных статей о том как можно превратить Gimp или Paint.NET в инструмент для схожих целей, но они мне не очень пришлись по вкусу. Если же у вас нет каких-то явных предпочтений, то присмотритесь к чему-то более ориентированному на пиксельарт и тайловую графику. Например Tile Studio или Aseprite. Я пользуюсь последним, в нём даже есть палитра sms сразу "из коробки", мелочь, а приятно.

6. Система контроля версий.

Система контроля версий, как я уже писал ранее, может вас поначалу сильно смутить. Зачем все эти сложности? Куча команд и новых терминов, кошмар просто! Но пусть вас это не пугает. Команд там не так много, а термины при ближайшем изучении довольно простые. Зато какие преимущества. Система контроля версий станет вашей персональной машиной времени, не просто способной вас переносить во времени назад и вперёд, но ещё и посещать различные варианты будущего и настоящего. Неплохо неправда ли? Жаль только что это распространяется только на исходные коды =) А всё что надо ради этого, лишь выучить несколько новых команд и концепций.

Систем контроля версий как популярных, так и не очень существует целое множество. Я буду использовать пожалуй самую популярную на сегодняшний день - git. А хранить проекты и исходные коды этого курса на популярном сервисе github который уже упоминался здесь. Однако этот факт не обязывает вас тоже пользоваться git'ом. Вы всегда можете зайти на сайт github.com найти там нужный репозиторий и скачать его в виде zip архива.

Если же вы решили что персональная машина времени для ваших исходных кодов, это всё же неплохая идея, то обучиться основам git'а можете здесь: https://git-scm.com/book/ru/v2

Заключение.

На этом пожалуй можно закончить настройку нашего инструментария и больше не возвращаться к этому вопросу какое-то время. Так что один из самых сложных начальных шагов позади и мы можем смело приступать к изучению самой SMS и программированию для неё. В следующем посте мы будем рассматривать общее внутреннее устройство консоли и её центральный процессор с точки зрения разработчика.