Внимание!!! Эта информация представляет собой перевод документации по NES, сделанный мной в начале 2003 года. С тех пор в моём распоряжении поввилось много более подробной и качественной информации, так что скоро эта часть будет переписана заново.
Информацию о NES на английском можно найти здесь
NES(Nintendo Entertainment System) - 8-битная игровая консоль, популярная
в 1980-х, в основном благодаря свой феноменально-большой софтверной базе. NES
был известен как Famicom (FAMily COMputer) в Японии.
Сердце NES это:
-6502 CPU - центральный процессор, сердце консоли
-PPU (Picture Processing Unit) - используется для управления графикой, спрайтами
и другими ориентированными на видео задачами.
-PAPU (pseuedo-Audio Processing Unit) - встроенный в CPU, генерирует звук
для 5 аудио каналов - 4 аналоговых и 1 цифровой.
A. Определения
CPU- Центральный процессор: итак понятно всем. NES использует стандартный
6502 (NMOS).
PPU- Графический сопроцессор: Используется для управления графикой,
спрайтами, и другими видео-ориентированными задачами.
PAPU- Псевдо-аудио процессор: встроенный в CPU; генерирует звуковые
потоки на 5 аудио каналов: 4 аналоговых и 1 цифровой.
MMC- Контроллер дополнительной памяти: Микро-контроллеры, используемые
в играх NES для доступа к памяти, находящеёся за пределами 64Kбайтного предела
6502 CPU. Jyb они также могут использоваться для доступа к дополнительной CHR-ROM,
или для таких "спецэффектов" как ускорение, IRQ, и.т.д.
VRAM- Видео память: встроена в PPU. Размер - 16kbit.
SPR-RAM- Память для спрайтов: 256 байт. Это не часть VRAM илиROM
PRG-ROM- ROM программ: Реальный программный код в памяти. Может изменяться
MMC.
PRG-RAM- RAM программ: синоним PRG-ROM, за исключением того, что RAM.
CHR-ROM- ROM символов: Данные VRAM, содержащиеся отдельно от PPU, изменяемые
MMC, или "загружаемые" в VRAM при включении.
VROM- Синоним CHR-ROM.
SRAM- RAM для сохранения: используется в таких играх как: "Crystalis,"
серия Final Fantasy, и "The Legend of Zelda."
WRAM- Синоним SRAM.
DMC- Канал дельта модуляции: Канал APU, управляющий цифровыми данными.
Рассматривается нами совместно с PCM (канал пульсирующего кода).
EX-RAM- Расширенная RAM: Память, используемая MMC5, расширяющая возможности
VRAM.
B. Оборудование
NES- Nintendo Entertainment System: эт ясно :)
Dandy, Dendy - Синоним Famicom.
Famicom- Синоним NES, за исключением того, что не поддерживает RAW
метод DMC циклический повтор цифровых аудио.
FDS- Famicom Disk System: Модуль, находящийся на верхушке Famicom,
поддерживающий 3" игровые диски двойной плотности.
3. CPU
A. Общая информация
NES обычно использует NMOS 6502 CPU, разработанный и произведённый Ricoh.
NTSC NES работает на частоте 1.7897725MHz, а PAL на1.773447MHz.
B. Карта памяти
Адреса
|
Размер
|
Флаги
|
Описание
|
$0000
|
$800
|
|
RAM |
$0800
|
$800
|
M
|
RAM |
$1000
|
$800
|
M
|
RAM |
$1800
|
$800
|
M
|
RAM |
$2000
|
$8
|
|
Регистры |
$2008
|
$1FF8
|
R
|
Регистры |
$4000
|
$20
|
|
Регистры |
$4020
|
$1FDF
|
|
Расшир. ROM |
$6000
|
$2000
|
|
SRAM |
$8000
|
$4000
|
|
PRG-ROM |
$C000
|
$4000
|
|
PRG-ROM |
Описание флагов: M = Зеркало $0000
R = Зеркало $2000-2008 каждые 8 байт
(например $2008=$2000, $2018=$2000, ...)
C. Прерывания
6502 процессор имеет 3 прерывания: IRQ/BRK, NMI, и RESET.
Каждое прерывание имеет вектор. Вектор это 16-битный адрес, указывающий,
куда перейти при выполнении прерывания. IRQ/BRK наступает при двух
обстоятельствах: когда исполняется программное прерывание (инструкция
BRK), или когда исполняется прерывание железа. RESET наступает при
включении NES. ROM загружается в память, и 6502 прыгает по адресу,
указанному в векторе RESET. При этом регистры не изменяются и память
не очищается; это происходит только при включении.
NMI (Non-Maskable Interrupt - немаскированное прерывание), генерируется
каждым обновлением экрана (VBlank), и занимает различные интервалы,
в зависимости от используемой системы (PAL/NTSC).
NMI обновляется 60 раз в секунду на NTSC контроллере и 50 раз в секунду
на PAL.
Продолжительность прерывания на 6502 7 циклов; это значит, что процессор
затрачивает 7 циклов для исполнения прерывания.
Большинство прерываний возвращаются, используя инструкцию RTI. Некоторые
карты NES не используют этот метод, например заставка КвадратSoft's
"Final Fantasy 1". Эти карты возвращаются из прерываний
очень странно: манипулируя стеками вручную, и потом вызывая RTS. Технически
это правильно, но таких вариантов стараются избежать.
Вышеописанные прерывания имеют соответствующие векторные адреса, указывающие
на области ROM:
$FFFA = NMI
$FFFC = RESET
$FFFE = IRQ/BRK
Приоритеты прерываний:
Наивысший = RESET
Средний = NMI
Низший = IRQ/BRK
D. NES-специфические особенности
Процессор 6502 не имеет поддержки десятеричной системы. И CLD и SED
инструкции работают нормально, но бит 'd' не используется ADC и SBC.
Аудио регистры находятся внутри CPU; генерация звуковых потоков очень
хорошо происходит и внутри CPU.
E. Примечание
Пожалуйста заметьте два разных 16K PRG-ROM сегмента; они могут идти
друг за другом, но играют разные роли. В зависимости от размера картриджа.
Некоторые игры только имеют только один 16K банк PRG-ROM, загружаемый в
оба сегмента памяти $C000 и $8000. Многие игры загружаются в $8000,
используя 32K пространства PRG-ROM. Первой игрой, использующей этот
метод стала Super Mario Brothers. Однако, все игры, имеющие более
одного 16K банка PRG-ROM загружаются в $8000 так же хорошо. Эти игры
используют Memory Mappers (мапперы памяти) для изменения PRG-ROM данных
точно также как и CHR-ROM.
6502 имеет баг в операции $6C (непрямой абсолютный переход). CPU не
ожет
правильно посчитать эффективный адрес, если младшие байты $FF.
Пример:
C100: 4F
C1FF: 00
C200: 23
..
D000: 6C FF C1 - JMP ($C1FF)
Логически, это переход на адрес $2300. Однако на самом деле старшие
байты вычисляемого адреса не увеличиваются, и реально переход на $4F00.
Остальные "приколы" процессора умышленно пропускаю.
4. PPU
A. Общая информация
Зеркальное отображение (так же известное как "затенение")
это процесс отображения отдельных адресов или адресных областей в
другие адреса/области самим железом.
B. Карта памяти
Включает в себя 2 карты памяти. Первая - "RAM Memory Map,"
которая несмотря на то, что описана немногословно, описывает текущие
области, которые указывают на физическую RAM в NES. Вторая это "Programmer
Memory Map" которая описывает целые области памяти NES и как
их использовать/манипулировать.
Карта памяти RAM
Адреса
|
Размер
|
Описание
|
$0000
|
$1000
|
Таблица рисунков #0 |
$1000
|
$1000
|
Таблица рисунков #2 |
$2000
|
$800
|
Таблица Имён |
$3F00
|
$20
|
Палитры |
Карта памяти программера
Адреса
|
Размер
|
Флаги
|
Описание
|
$0000
|
$1000
|
C
|
Таблица рисунков 0 |
$1000
|
$1000
|
C
|
Таблица рисунков 1 |
$2000
|
$3C0
|
|
Имя Таблицы 0 |
$23С0
|
$40
|
N
|
Атрибуты таблицы 0 |
$2400
|
$3C0
|
N
|
Имя Таблицы 1 |
$27С0
|
$40
|
N
|
Атрибуты таблицы 1 |
$2800
|
$3C0
|
N
|
Имя Таблицы 2 |
$2BC0
|
$40
|
N
|
Атрибуты таблицы 2 |
$2C00
|
$3C0
|
N
|
Имя Таблицы 3 |
$2FC0
|
$40
|
N
|
Атрибуты таблицы 3 |
$3000
|
$F00
|
R
|
|
$3F00
|
$10
|
|
Палитра изобр. 1 |
$3F10
|
$10
|
|
Палитра спрайтов 1 |
$3F20
|
$E0
|
P
|
|
$4000
|
$C000
|
F
|
|
C = Возможно CHR-ROM
N = Отображено (см. отдел G)
P = Отображено (см. отдел H)
R = Зеркало $2000-2EFF (VRAM)
F = Зеркало $0000-3FFF (VRAM)
C. Таблица Имен
NES отображает графику, используя матрицу "тайлы"; эта сетка
названа Таблица Имён. Тайлы имеют размер 8x8 пикселей. Целая Таблица
Имён имеет 32x30 плиток (256x240 пикселей).
Таблица Имён содержит номера плиток, которые, в свою очередь хранятся
в Таблице Рисунков.
D. Таблица Рисунков
Таблица Рисунков содержит реальные 8x8 тайлы. Она также содержит два
младших бита 4-битной цветовой матрицы, необходимых для доступа ко
всем 16 цветам палитры NES. Пример:
VRAM адрес
|
Содержимое таблицы рисунков
|
|
Результат цвета
|
|
$0000
..
..
..
..
..
..
$0007
|
00010000 = $10
00000000 = $00
01000100 = $44
00000000 = $00
11111110 = $FE
00000000 = $00
10000010 = $82
00000000 = $00
|
БИТ 0
|
___1____
__2_2___
_3___3__
2_____2_
1111111_
2_____2_
3_____3_
________
|
_ означает цвет 0.
Номера представляют цвета из палитры.
|
$0008
..
..
..
..
..
..
$000F
|
00000000 = $00
00101000 = $28
01000100 = $44
10000010 = $82
00000000 = $00
10000010 = $82
10000010 = $82
00000000 = $00
|
БИТ 1
|
|
|
Результат этой Таблицы Рисунков будет буква 'A'
E. Таблица Атрибутов
Каждый байт Таблицы Атрибутов представляет группу плиток 4x4 на экране.
Есть несколько способов её применения.
Байт в Таблице Атрибутов:
* Держит старшие 2 бита 32x32 пиксельной сетки на 16x16 пикселей.
* Держит старшие 2 бита шестнадцати 8x8 плиток.
* Держит старшие 2 бита четырёх 4x4 сеток тайлов.
Ничего непонятно. Давайте так:
Квадрат 0
#0 #1
#2 #3
|
Квадрат 1
#4 #5
#6 #7 |
Квадрат 2
#8 #9
#A #B |
Квадрат 3
#C #D
#E #F |
#0-F представляют плитку 8x8
Квадрат [x] представляет четыре 8x8 тайлов (или 16x16 пиксельную сетку)
Формат байта атрибута:
Байт атрибута
(Квадрат #)
33221100
||||||||
||||||+--- Два старших бита цвета для Квадрата 0 (Тайлы #0,1,2,3)
||||+----- Два старших бита цвета для Квадрата 1 (Тайлы #4,5,6,7)
||+------- Два старших бита цвета для Квадрата 2 (Тайлы #8,9,A,B)
+--------- Два старших бита цвета для Квадрата 3 (Тайлы #C,D,E,F)
F. Палитры
NES имеет две 16-цветные палитры: Палитру Изображения и Палитру Спрайтов.
Эти палитры не содержат физических RGB значений.
G. Отображение Таблицы Имён
Одно надо держать в голове, что есть много форм отображения. Некоторые
методы даже используются CHR-ROM Таблицей имён (спецификация маппера).
NES только содержит 2048 ($800) байт RAM, используемых для Таблицы Имён.
Однако, NES имеет возможность адресации до четырёх Таблиц Имён.
По умолчанию многие карты имеют "горизонтальное" и "вертикальное"
отображение, позволяющее вам изменять в Таблице Имён указатель на
PPU RAM. Эта форма отображения затрагивает две Таблицы Имён одновременно;
невозможно переключить Таблицы Имён независимо.
Типы отображения NES. Заметьте, что адреса 12-ти битные;
Имя
|
ТИ 0
|
ТИ 1
|
ТИ 2
|
ТИ 3
|
Флаги
|
Горизонтальная
Вертикальная
4 экрана
Один экран
CHR-ROM отображение
|
$000
$000
$000
|
$000
$400
$400
|
$400
$000
$800
|
$400
$400
$C00
|
F
S
C
|
F = 4 экранное отображение производится на дополнительных 2048 ($800)
RAM (резерв в карте), результируясь в 4 физически независимых Таблицах
Имён.
S = Одно-экранные игры имеют мапперы, позволяющие выбрать, какие области
PPU RAM вы хотите использовать ($000, $400, $800, или $C00); Все Таблицы
Имен указывают на один PPU RAM адрес.
C = Маппер#68 (Afterburner 2) позволяет вам отобразить CHR-ROM в
область Таблицы Имён области PPU RAM. Это делает Таблицу Имён основанной
на ROM, и никто не сможет писать туда.
Однако, эта особенность может контролироваться самим маппером, Отключая
или включая её.
H. Отображение палитры
Отображение происходит между Палитрой Изображения и Палитрой Спрайтов.
Любые данные, записанные в $3F00 отображаются в $3F10, $3F04 - $3F14,
итд.
Цвет #0 в верхних трёх палитрах и Изображения и спрайтов определяет
прозрачность (настоящий цвет сохраняется, но не вырисовывается на
экране).
PPU использует значение $3F00 для цвета фона.
Простой пример:
* $0D записываем в $3F00 (отображается в $3F10)
* $03 записываем в $3F08 (отображается в $3F18)
* $1A пишем в $3F18
* $3F08 читаем в аккумулятор
PPU будет использовать $0D как цвет фона, несмотря на то, что $3F08
имеет значение $03. В итоге аккумулятор получит значение $1A, которое
отображается в $3F18. Но значение $1A не рисуется, пока цвет #0 определяет
прозрачность. Обе палитры и Изображения и Спрайтов отображаются в
разных частях VRAM;
$3F20-3FFF - зеркала обоих палитр соответственно.
Байты D7-D6, записанные в $3F00-3FFF игнорируются.
I. Скроллинг фона
NES может проводить скроллинг заднего плана (Заранее отредендированная
Таблица Имён + Таблица Палитр + Таблица Атрибутов) независимо от Спрайтов,
которые накладываются поверх фона. Скроллинг фона может быть горизонтальным
и вертикальным.
Скроллинг работает как следствие:
Горизонтальный скроллинг:
Вертикальный скроллинг:
Таблица Имён "A" определена битами D1-D0 в регистре $2000,
и "B" Таблица Имён следом (в процессе отображения, динамическая).
Это не работает для игр, использующих Горизонтальный и Вертикальный
скроллинг одновременно.
Фон будет прокручен:
Таблица имен 2
($2800)
|
Таблица имен 3
($2C00)
|
Таблица имен 0
($2000)
|
Таблица имен 1
($2400)
|
Записывая в Горизонтальный Скроллинг значение в $2005 имеет значение от
0 до 256.
Записываемое в Вертикальный Скроллинг значение - от 0-239; значение выше
239 считается отрицательным (248 реально -8).
J. Наложение Экрана и Спрайтов
Существует особый порядок, с помощью которого NES рисует свой контент:
Сначала проводятся операции с портами раширения видеосигнала, затем
рисуются спрайты, если приоритет фона=1, после чего рисуется фон.
Если приоритет фона равен 0, что спрайты рисуются после фона. После
всего этого накладывается интенсивность цвета.
K. Спрайты и SPR-RAM
NES поддерживает 64 спрайта, имеющие размеры 8x8 или 8x16 пикселей.
Данные спрайтов находятся внутри Таблицы Рисунков VRAM.
Атрибуты Спрайтов, такие как flipping и приоритет, находятся в SPR-RAM,
которая разделена на области памяти размером по 256 байт, независимо от
ROM и VRAM. Формат SPR-RAM:
Спрайт 0
|
Спрайт 1
|
...
|
Спрайт 63
|
Спрайты:
Байт
|
Биты
|
Описание
|
0
1
2
3
|
YYYYYYYY
IIIIIIII
vhp000cc
XXXXXXXX
|
Y Координаты - 1. Координаты верхнего
левого угла спрайта
Индекс Тайлы #
Атрибуты
v = Вертикальный Flip (1=Flip)
h = Горизонтальный Flip (1=Flip)
p = Приоритет фона
0 = Впереди
1 = Позади
c = Верхние 2 бита цвета
X Координата верхнего левого угла |
Спрайты с размерами 8x16 работают чуть-чуть по-другому. 8x16 спрайт,
имеющий чётные Индексы Тайлов # использует Таблицу Рисунков $0000
в VRAM; нечётные Индексы Тайлов # используют $1000.
*ДА!!!*: Регистр $2000 не оказывает действие на 8x16 спрайты.
Все 64 спрайта имеют внутренний приоритет; спрайт #0 имеет больший
приоритет, чем спрайт #63 (спрайт #0 будет нарисован последним).
Только 8 спрайтов может показываться на строку. Каждая запись в SPR-RAM
проверяется для того, чтобы увидеть горизонтальные границы с другими спрайтами.
L. Горизонтальная и Вертикальная пустота
NES, как любая консоль обновляет экран. Обновление происходит 60 раз
в секунду на NTSC устройствах, и 50 на PAL.
Электронная пушка рисует пиксели слева направо: в результате рисуется
одна строка экрана. После прорисовки строки луч должен вернутся в
левую часть экрана. Процесс возвращения в левую часть экрана называется
период Горизонтальной пустоты (HBlank). Почему пустоты? Всё очень
просто, при перемещении луч просто выключается, чтобы не искажать
картинку.
Когда луч дорисовывает последнюю строку, он должен вернутся в верхнюю
точку экрана; время, за которое луч перемещается вверх называется
периодом Вертикальной пустоты (VBlank). От себя хочется добавить,
если луч при обратном движении не выключать, то экран просто начнёт
мелькать.
Луч движется зигзагами:
Экран NTSC NES выглядит так:
Флаг Вертикальной пустоты (VBlank) находится в D7 - $2002. Он указывает,
находится PPU в VBlank или нет. Программа может сбросить D7 читая $2002.
N. Примечание.
PPU автоматически увеличивает адрес VRAM на 1 или 32 (зависит от D2
- $2000) после доступа к $2007.
5. pAPU
A. Общая информация
NES использует 4 канала аналогового синтезатора и 1 канал для цифрового
звука. Приставка "pseudo" означает, что у NES нет отдельного
аудио процессора, как например у SNES (SPC700). Первые 2 канала pulse
(square), третий triangle. Четвёртый канал - noise. Пятый канал -
DMC (PCM).
E. DMC (PCM) Канал
DMC канал, он же 'PCM' канал использует 2 метода для аудио воспроизведения:
DMA и RAW. DMA метод используется намного чаще. Для воспроизведения звука надо:
1) Установить $4012 (DMC Адресный регистр) на 64-байтное смещение PRG-ROM $C000-FFFF.
2) Установить $4013 (DMC Регистр Длины) на длину сэмпла, длина определяется:
(16*х)+1, где х-записываемое значение.
3) Установить $4010 (DMC Частотный регистр) на 4-битную частоту
4) Установить Бит #4 - $4015 (Управления каналом) в 1, включая DMC канал.
Данные сэмпла, используемые для иетода DMA это 1-bit данные без знака.
Настоящий формат данных не известен, как и задержки воспроизведения.
RAW метод используется в играх, типа Tengen's "Gauntlet 2,"
для 8-битного звучания высокого качества.
6. Джойстики и порты расширения
A. Общая информация
NES поддерживает несметное множество устройств ввода, включая джойстики,
световые пистолеты (Запперы), и устройства для четырёх игроков.
Джойстики #1 и #2 доступны через $4016 и $4017, соответственно.
Джойстики сбрасываются путём Стробирующего метода: записывая 1, затем
0 в $4016. См. секцию H для информации о "стробировании наполовину"
При полном стробировании, статус кнопок джойстика возвращается однобитным
потоком (D0). Для чтения полной информации о состоянии контроллера
необходимо произвести довольно много операций чтения.
1 = A
2 = B
3 = SELECT
4 = START
5 = UP
6 = DOWN
7 = LEFT
8 = RIGHT |
9 = игнор.
10 = игнор.
11 = игнор.
12 = игнор.
13 = игнор.
14 = игнор.
15 = игнор.
16 = игнор. |
17 = Обозначение
18 = Обозначение
19 = Обозначение
20 = Обозначение
21 = 0
22 = 0
23 = 0
24 = 0 |
В секции G даётся расшифровка Обозначений.
B. Заппер (Световой пистолет)
Заппер просто использует биты внутри $4016 и $4017, описанные в секции
8.
См. Биты D4, D3, и D0.
Также сужествует возможность иметь два Заппера, подключенными к обоим
портам джойстиков одновременно.
C. Устройства для четырех игроков.
Некоторые NES игры позволяли использовать адаптеры для 4 игроков,
расширяя число используемых джойстиков с 2 до 4. Примеры таких игр:
"Gauntlet II," и "RC Pro Am 2."
Все 4 контроллера читают свои статус из битов из D0 $4016 или $4017,
как показано в секции A.
Для регистра $4016, читаются биты 1-8 для #1, и 9-16 для #3. Для $4017,
соответственно для #2 и #4 как показано в табличке:
1 = A
2 = B
3 = SELECT
4 = START
5 = UP
6 = DOWN
7 = LEFT
8 = RIGHT |
9 = A
10 = B
11 = SELECT
12 = START
13 = UP
14 = DOWN
15 = LEFT
16 = RIGHT |
17 = Обозначение
18 = Обозначение
19 = Обозначение
20 = Обозначение
21 = 0
22 = 0
23 = 0
24 = 0 |
D. Paddle
"Arkanoid" использует paddle (падл) как первый контроллер.
Положение Падла читается из D1 - $4017; причём данные инвертированы
(0=1, 1=0). Первое значение - MSB, и 8-е - LSB. Возможные значения
от 98 до 242, где 98 - указывает на то, что Падл полностью повернут
по часовой стрелке.
Падлы также имеют одну кнопку, значение которой читается из D1 - $4016.
Значение 1 - кнопка нажата.
E. Power Pad
Информация отсутствует.
F. R.O.B. (Robot Operated Buddy)
Информация отсутствует.
G. Описания
Описание позволяет программисту определить, подключено ли устройство
к одному из 4 портов или нет, и что это за устройство. Возможные значения:
%0000 = Отключено
%0001 = Джойстик (только $4016)
%0010 = Джойстик (только $4017)
H. Порты расширения
Процесс стробирования джойстиков требует 2 записи: сначала 1, затем
0. Если процесс стробирования не закончен, при нестандартных ситуациях,
джойстик перестаёт быть пунктом соединения: становится расширенным
портом.
Для пользователей NES, порт расширения находится внизу юнита, и закрыт
маленьким серым кусочком пластика. Пользователи Famicom имели ограниченный
порт расширения впереди юнита, который совместно использовался для
джойстиков и турбо-джойстиков..
7. Мапперы здесь не рассматриваются.
8. Регистры
Программист работает с PPU и pAPU через регистры, (регистр это не
более чем заранее установленная область памяти, позволяющая делать
изменения в NES. Без регистров программы не работают.
Каждый регистр представляет собой 16-битный адрес. Кроме этого регистры
бывают: для чтения ( R ), для записи ( W ), для двойной записи ( 2
) и 16-ти битные регистры ( 16 ) 16-битные регистры на самом деле
состоят из двух подряд идущих 8-битных регистра, которые можно записать
немедленно. Их называют 16-ти битными для простоты. Например "$4002+$4003"
означает, что биты D15-D8 находятся в $4003, а биты D7-D0 в $4002.
В таблице не указаны неиспользуемые биты.
Адрес
|
Описание
|
$2000 |
PPU Регистр Управления #1 (W)
D7: Исполняет NMI при VBlank
0 = Нет
1 = Да
D6: PPU Master/Slave Selection (не используется)
0 = Master
1 = Slave
D5: Размер Спрайта
0 = 8x8
1 = 8x16
D4: Адрес Табилцы Рисунков ФОНА
0 = $0000 (VRAM)
1 = $1000 (VRAM)
D3: Адрес Таблицы Рисунков Спрайтов
0 = $0000 (VRAM)
1 = $1000 (VRAM)
D2: PPU Увеличение адреса
0 = Увеличивается на 1
1 = Увеличивается на 32
D1-D0: Адрес Таблицы Имён
00 = $2000 (VRAM)
01 = $2400 (VRAM)
10 = $2800 (VRAM)
11 = $2C00 (VRAM) |
$2001 |
PPU Регистр Управления #2 (W)
D7-D5: Полный цвет Фона (когда D0 = 1)
000 = Нет
001 = Зелёный
010 = Синий
100 = Красный
D7-D5: Интенсивность цвета (когда D0 = 0)
000 = Нет
001 = Интенс. Зелёный
010 = Интенс. Синий
100 = Интенс. Красный
D4: Видимость Спрайтов
0 = Спрайты не показываются
1 = Спрайты показываются
D3: Видимость Фона
0 = Фон не показывается
1 = Фон показывается
D2: Обрезка Спрайтов
0 = Спрайты не видны в левых 8 пикселях столбца
1 = Не обрезаются
D1: Обрезка фона
0 = Фон не виден в левых 8 пикселях столбца
1 = Не обрезается
D0: Тип дисплея
0 = Цветной дисплей
1 = Монохромный дисплей |
$2002 |
PPU Регистр Состояния (R)
D7: Vblank
0 = Не Vblank
1 = VBlank
D6: Спрайт #0
0 = Спрайт #0 не найден
1 = PPU имеет Спрайт #0
D5: Количество Спрайтов на строку
0 = 8 Спрайтов или меньше на строку
1 = Более 8 Спрайтов на текущую строку
D4: Флаг записи VRAM
0 = Запись во VRAM разрешена
1 = Запись во VRAM игнорируется
Да,D7сбрасывается в 0 после чтения. |
$2003 |
SPR-RAM Адресный Регистр (W)
D7-D0: 8-битный адрес в SPR-RAM для доступа к $2004. |
$2004 |
SPR-RAM Регистр Ввода/Вывода (W)
D7-D0: 8-битные данные, записываемые в SPR-RAM. |
$2005 |
VRAM Адресный Регистр #1 (W2)
Совместно используется для скроллинга экрана (Исключая Спрайты)
горизонтаьлно и вертикально. Однако на самом деле внутри NES
нет устройства для скроллинга. Этот регистр контролируее адресные
линии VRAM. |
$2006 |
VRAM Адресный Регистр #2 (W2)
Совместно используется для 16-битной адресации VRAM для доступа
через $2007. Однако этот регистр контролирует адресные биты
VRAM, и поэтому их нужно использовать с особой осторожностью. |
$2007 |
VRAM Регистр Ввода/Вывода (RW)
D7-D0: 8-бит данных для чтения или записи VRAM. |
$4000
$4001
$4002
$4003
$4004
$4005
$4006
$4007
$4008
$4009
$400A
$400B
$400C
$400D
$400E
$400F
$4010
$4011
$4012
$4013
|
pAPU Pulse #1 Регистр Управления (W)
pAPU Pulse #1 Ramp Регистр Управления (W)
pAPU Pulse #1 Fine Tune (FT) Регистр (W)
pAPU Pulse #1 Coarse Tune (CT) Регистр (W)
pAPU Pulse #2 Регистр Управления (W)
pAPU Pulse #2 Ramp Регистр Управления (W)
pAPU Pulse #2 Fine Tune Регистр (W)
pAPU Pulse #2 Coarse Tune Регистр (W)
pAPU Triangle Регистр Управления #1 (W)
pAPU Triangle Регистр Управления #2 (?)
pAPU Triangle Frequency Регистр #1 (W)
pAPU Triangle Frequency Регистр #2 (W)
pAPU Noise Control Регистр #1 (W)
Unused (???)
pAPU Noise Frequency Регистр #1 (W)
pAPU Noise Frequency Регистр #2 (W)
pAPU Delta Modulation Регистр Управления (W)
pAPU Delta Modulation D/A Регистр (W)
pAPU Delta Modulation Address Регистр (W)
pAPU Delta Modulation Data Length Регистр (W) |
$4014 |
Регистр DMA Спрайтов (W)
Передаёт 256 байт памяти в SPR-RAM. Адрес читается из
$100*N, где N - записываемое значение. |
$4015 |
pAPU Sound/Vertical Clock Signal Регистр (R)
D6: Vertical Clock Signal IRQ Availability
0 = One (1) frame occuring, hence IRQ cannot
occur
1 = One (1) frame is being interrupted via IRQ
D4: Delta Modulation
D3: Noise
D2: Triangle
D1: Pulse #2
D0: Pulse #1
0 = Not in use
1 = In use |
pAPU Channel Control (W)
D4: Delta Modulation
D3: Noise
D2: Triangle
D1: Pulse #2
D0: Pulse #1
0 = Channel disabled
1 = Channel enabled |
$4016 |
Joypad #1 (RW)
Запись:
D4: Zapper Trigger
0 = Pulled
1 = Released (not held)
D3: Zapper Sprite Detection
0 = Sprite not in position
1 = Sprite in front of cross-hair
D0: Joypad Data |
Joypad Strobe (W)
Запись:
D0: Joypad Strobe
0 = Clear joypad strobe
1 = Reset joypad strobe |
Запись:
Expansion Port Latch (W)
D0: Expansion Port Method
0 = Write
1 = Read |
$4017 |
Joypad #2/SOFTCLK (RW)
Чтение:
D7: Vertical Clock Signal (External)
0 J= Not occuring
1 = Occuring
D6: Vertical Clock Signal (Internal)
0 = Occuring (D6 of $4016 affected)
1 = Not occuring (D6 of $4016 untouchable)
D4: Zapper Trigger
0 = Pulled
1 = Released (not held)
D3: Zapper Sprite Detection
0 = Sprite not in position
1 = Sprite in front of cross-hair
D0: Joypad Data |
Запись:
Expansion Port Latch (W)
D0: Expansion Port Method
0 = ???
1 = Read |
9. Форматы файлов
A. iNES Формат (.NES)
Смещение
|
Размер
|
Контент
|
0
3
4
5
6
7
8-15
16-..
...
...
..-EOF
|
3
1
1
1
1
1
8
|
'NES'
$1A
16K PRG-ROM количество страниц
8K CHR-ROM количество страниц
ROM Байт Управления #1
%####vTsM
| ||||+- 0=Горизонтальное отображение
| |||| 1=Вертикальное отображение
| |||+-- 1=SRAM Включено
| ||+--- 1=512-байтовый тренер
| |+---- 1=4-экранное отображение
| |
+--+----- № Маппера # (нижние 4 бита)
ROM Байт Управления #2
%####0000
| |
+--+----- Маппер# (верхние 4 байта)
$00
Число 16K PRG-ROM страниц (в линейном
порядке). Если есть тренер, то указывает
на первую PRG-ROM страницу.
CHR-ROM страницы (в восходящем порядке). |
Пока всё.
|