Я решил начать небольшой цикл статей по программированию для Nintendo Entertainment System, она же NES, она же Dendy в наших краях. Сегодня рассмотрим как настроить рабочую среду на компьютере и попробуем собрать небольшое приложение.

В первой части я не буду рассматривать архитектуру консоли, описывать регистры процессора и видеоконтроллера, а лишь расскажу как настроить удобным образом «IDE» для разработки под данную систему. Т.к. на моей машине используется Linux-система, то данное руководство будет в отношении нее, но теоретически на Windows и MacOS тоже будет работать.
Разработка приложений будет на ассемблере, а точнее на его варианте для процессора MOS 6502 — NES ASM. Взять данный ассемблер можно здесь или по прямой линке, я рекомендую взять последнюю стабильную версию nbasic and nesasm (march 14, 2004). Также существует 3я версия данного ассемблера, но я не нашел его для linux-систем. Для тестирования результата воспользуемся эмулятором, например известный FCEUX.
В качестве редактора кода я рекомендую воспользоваться Sublime Text 2, для некоммерческого использования им можно пользоваться свободно. Хорош он тем, что имеет подстветку синтаксиса для NES ASM, но в базовую комплектацию она не входит. Ее нужно будет скачать и добавить к существующим стилям, стянуть можно здесь. Чтобы добавить на linux машине можно простым вызовом команды в терминале:

cd ~/.config/sublime-text-2/Packages/ && git clone https://github.com/klaussilveira/SublimeNESASM.git

Или же просто выкачать архив и распаковать его содержимое в каталог ~/.config/sublime-text-2/Packages/
Теперь нужно настроить сборку программы по горячим клавишам из Sublime. В главном меню выбираем Tools->Build System->New Build System. Создастся новый текстовый файл с содержимым вида:

{

    «cmd»: [«make»]

}

Которое необходимо поменять на такого вида:

{

    «cmd»: [«<путь к nesasm>/nbasic_2004_03_14/bin_linux/nesasm», «$file»]

}

Вот пример моего конфига:

{

«cmd»: [«/media/MEDIA/Projects/nesdev/tools/nbasic_2004_03_14/bin_linux/nesasm», «$file»]

}

После таких изменений сборка программы будет выполняться простым нажатием Ctrl+B прямо из текстового редактора, а в окне вывода редактора будет отображаться состояние сборки.
На этом настройка закончена, скажу только что для включения подсветки синтаксиса NES ASM нужно в главном меню выбрать View->Syntax->NES ASM. В итоге должно получится что-то вроде такого

Ну а в качестве упражнения можно собрать такую программку, которая ничего не делает, только заливает фон зеленым цветом

.inesprg 1 ; 1x 16KB PRG code
.inesprg 1 ; 1x 16KB PRG code
.ineschr 0 ; zero CHR bank
.inesmir 0 ; mirroring type 0
.inesmap 4 ; memory mapper 4 (MMC3)

;;;;;;;;;;;;;;;

.bank 0
.org $C000
RESET:
JSR vwait
LDA #$80
STA $2000 ; turn NMI generation on
LDA #$08
STA $2001 ; turn the BG on so that MMC3 can count
LDA #$40
STA $4017 ; disable frame counter IRQs
CLI

Forever:
JMP Forever ;jump back to Forever, infinite loop

NMI:
LDA #$3F ; the background color to red
STA $2006
LDA #$00
STA $2006
LDA #$0A
STA $2007

LDA #$01 ;up MMC3 to generate an IRQ after 120 scanlines
STA $E000
LDA #$78
STA $C000
STA $C001
LDA #$01
STA $E000
STA $E001

LDA #$00
STA $2006
STA $2006

LDA #$00
STA $2001 ; background on to enable counting for MMC3
RTI

IRQ:
PHA
TXA
PHA
TYA
PHA

LDA #$00
STA $2001

LDA #$3F ; the background color to green
STA $2006
LDA #$00
STA $2006
LDA #$0A
STA $2007

LDA #$01
STA $E000 ; acknowledge the IRQ and disable further IRQ generation

LDA #$00
STA $2006
STA $2006

PLA
TAY
PLA
TAX
PLA

RTI

vwait:
LDA $2002
BPL vwait ;wait for start of retrace
vwait_pass2:
LDA $2002
BMI vwait_pass2 ;wait for end of retrace
RTS

;;;;;;;;;;;;;;

.bank 1
.org $FFFA ;first of the three vectors starts here NMI, RESET and IRQ
.dw NMI
.dw RESET
.dw IRQ

Жмем Ctrl+B или Tools->Build и в окне вывода должны появится инфа что сборка прошла успешно: pass 1 pass2. После чего в каталоге с файлом появится бинарный ROM файл, с именем <имя асм файлы>.nes , который можно запустить на эмуляторе. Ниже скриншот того что делает вышеприведенная программа