Комментарии 10
Изучение ассемблера 6502-го имеет и вполне практический интерес — CMOS-версия этого процессора и сейчас еще как жива в embedded.
У вас странная организация циклов:
Здесь инструкция CPX #255 является лишней, так как во время инкремента X при достижении значения X=0 (255+1=0) во флаг процессора Z устанавливается 1, переход BNE не срабатывает и выполнение переходит к следующей инструкции (цикл заканчивается).
Цикл загрузки палитры тоже не очень:
Здесь команда INX может повлиять на флаг Z из-за чего переход по BNE может сработать некорректно. В таких случаях обычно команду сравнения ставят непосредственно перед командой перехода, примерно так:
...
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 есть)
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(собственно код) пока не погружался в этот вопрос глубже)
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. Исходники тут. Оригинал утилиты по предыдущей ссылке.
В качестве инструментов можно (а зачастую и нужно) использовать такой набор.
(Да, я учел, что Вы — пользователь 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 (первый жойстик) значение полученное с него передаю как номер спрайта и отображаю его
В итоге выводиться спрайт соответствующий маски нажатия кнопки. На днях попробую Mednafen или Mesen возможно с ними проще будет.
Да в 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 же наоборот, весь на гуях, позволяющий видеть работающую консоль буквально «насквозь».
Также рекомендую веб IDE 8bit Workshop, позволяющую писать и эмулировать код NES и некоторых других консолей/домашних компьютеров. Это очень и очень здорово пригождается для быстрого старта, а также при реверс-инжиниринге классических игр.
Кстати, у Mednafen типично «линуксовый» подход к интерфейсу дебаггера. Вообще эмулятор консольный (+гуя, отдельным пакетом «Mednaffe»), но дебаггер там выводится поверх изображения эмулируемой приставки. Минимализм как в наборе инструментов так и в визуализации внутренностей, но иногда хватает.
Mesen же наоборот, весь на гуях, позволяющий видеть работающую консоль буквально «насквозь».
Спасибо, достаточно познавательная статья.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Программирование NES (dendy), assembler 6502