Pull to refresh

Comments 10

Изучение ассемблера 6502-го имеет и вполне практический интерес — CMOS-версия этого процессора и сейчас еще как жива в embedded.

У вас странная организация циклов:
...
CPX #255
INX
BNE section

Здесь инструкция CPX #255 является лишней, так как во время инкремента X при достижении значения X=0 (255+1=0) во флаг процессора Z устанавливается 1, переход BNE не срабатывает и выполнение переходит к следующей инструкции (цикл заканчивается).
Цикл загрузки палитры тоже не очень:
LDX #$00
...
LDA background_pallete, x
STA $2007
CPX #$0F
INX
BNE loadPallete

Здесь команда INX может повлиять на флаг Z из-за чего переход по BNE может сработать некорректно. В таких случаях обычно команду сравнения ставят непосредственно перед командой перехода, примерно так:
LDA background_pallete, x
STA $2007
INX
CPX #$10
BNE loadPallete

Большое спасибо! За такой комментарий, просто с ассемблером начал заниматься месяц назад, после php очень сложно освоиться в нем. Я пока ставлю себе простые цели, например анимация, считывание нажатий контроллеров, погрузился в побитовые операции («и» и «или») хотя немного с ними работал с флагами в частности.
Какие сейчас есть актуальные инструменты сборки для Windows/Linux с хорошей документацией? Есть ли редакторы (плагины к ним) и/или IDE с подсветкой синтаксиса, навигацией по коду и т.п.?
Я использую под linux:
1. ca65 и ld65 для сборки (под windows NESASM есть)
ca65 test.s -o test.o // асемблер
ld65 test.o -C nesfile.ini -o test.nes // линкер

2. Редакторов графики с помощью которых можно бы было создать новый файл chr я не нашёл, но файл chr простой по этому написал конвертер с chr — bmp сейчас допиливаю обратную конвертацию. (YY-CHR есть под windows я не смог его под wine запустить)
3. Редакторов nametable пока тоже не нашёл (YY-CHR вроде умеет но под windows)
4. Код писал в sublime. Но в принципе даже vim, nano подсвечивают код.
5. Эмулятор FCEUX
6. Тестирование на железе в планах приобрести flash картридж (далее скорее всего изготовлю картридж он тоже не сложный в принципе по сути всего 2 чипа с CHR ROM(графика) и PRG ROM(собственно код) пока не погружался в этот вопрос глубже)
Отличное начинание! По поводу предыдущих двух комментов.
В качестве инструментов можно (а зачастую и нужно) использовать такой набор.
(Да, я учел, что Вы — пользователь Linux, но может быть уместно вспомнить про wine.)
1. cc65 как Си, ca65 как асм — хороший, правильный выбор.
2. NES Screen Tool, можно скачать на страничке автора. Позволяет импортировать bmp картинки, автоматически разбивая их на тайлы. Горячие клавиши для копирования в буфер обмена данных уже в нужном синтаксисе: nesasm, ca65, cc65. Ну и другие плюшки, которые облегчат процесс работы с графикой.
3. См. п. 2
4. Тоже использую Sublime, некоторым нравится VS Code, в общем, прикручивается куда угодно.
5. Эмуляторы: FCEUX, Mednafen, Mesen. Все трое имеют ряд преимуществ и недостатков. У всех трёх есть средства отладки (в линуксовом FCEUX вроде бы нет). В плане отладки лидирует Mesen. Собирал его под Арчом.
6. Тестировать можно (и нужно) в вышеуказанных эмуляторах, для верности ещё добавить несколько: puNES, Nestopia, NNNesterJ. Только последние два поддерживают все регистры звукового чипа YM2149f (маппер Sunsoft 5b). Если в коде есть какие-либо трюки типа вертикального скроллинга после zero-hit сплита, будет уместным проверять это всё на реале через флэш-карт.
От себя добавлю.
7. NES Space Checker. Утилита, позволяющая наглядно посмотреть эффективность использования картриджа (карта CHR и PRG банков в графическом виде). Я переносил её на QT, т.е. можно собрать также и под Linux. Исходники тут. Оригинал утилиты по предыдущей ссылке.
Спасибо!
Да в FECUX нет дебагере под linux и это доставляет не удобство, в плане отладки, Я делаю так если надо сдампить полученные данные с какого либо регистра в частности $4016 (первый жойстик) значение полученное с него передаю как номер спрайта и отображаю его

LDA $4016
STA buttons
; buttons это 1 байт в zero page про который будет следующая статья
LDA #100
STA $2004
LDA buttons
STA $2004
LDA #%00010111
STA $2004
LDA #100
STA #2004


В итоге выводиться спрайт соответствующий маски нажатия кнопки. На днях попробую Mednafen или Mesen возможно с ними проще будет.
Я думал, Вы знаете что есть библиотека neslib. Она содержит уже оптимизированный код для вывода спрайтов, музыки, фона, опроса джойстиков, в общем, всё, что нужно для создания игры. Само собой, следует понимать, как работает приставка, и код с нуля помогает в этом эффективнее, но иногда стоит пользоваться и готовыми решениями, к тому же исходники можно прочитать, понять, и заточить под себя, если нужно. Я дописывал neslib для работы с редкоземельными мапперами, или добавлял функции для «проигрывания» дампов джойстика. Это применяется в attract mode в любой классической игре чтобы приставка «играла в игру сама», демонстрируя геймплей потенциальным покупателям аркадных игр, т.е. вероятно, это рудимент аркад.
Также рекомендую веб IDE 8bit Workshop, позволяющую писать и эмулировать код NES и некоторых других консолей/домашних компьютеров. Это очень и очень здорово пригождается для быстрого старта, а также при реверс-инжиниринге классических игр.
Кстати, у Mednafen типично «линуксовый» подход к интерфейсу дебаггера. Вообще эмулятор консольный (+гуя, отдельным пакетом «Mednaffe»), но дебаггер там выводится поверх изображения эмулируемой приставки. Минимализм как в наборе инструментов так и в визуализации внутренностей, но иногда хватает.
Mesen же наоборот, весь на гуях, позволяющий видеть работающую консоль буквально «насквозь».
Да цель больше понять все что происходит внутри консоли :-) Спасибо за дельные советы, обязательно попробую mednafen и mesen

Спасибо, достаточно познавательная статья.

Sign up to leave a comment.

Articles