Примерно раз в десятилетие на русскоязычных около-компьютерных ресурсах кто-нибудь поднимает тему такого элемента архитектуры 8-битной Денди и её прародителей, как «маппер», пытаясь на пальцах объяснить, что же это такое. И каждый раз у меня возникает ощущение, что рассказчики сами не вполне знакомы с сюжетом. К тому же практически всегда речь идёт о чисто технических моментах, совершенно не затрагивая историю вопроса: откуда взялось, как развивалось, чем было полезно для фактических игр — что, на мой взгляд, может быть интересно гораздо более широкому кругу лиц.
Так сложилось, что я имею довольно глубокий, примерно по локоть, практический опыт взаимодействия с этими самыми «мапперами», также могу рассказать кое-что и за их историю, и, разумеется, обладаю уверенностью, что уж я-то точно понимаю всё как есть, и расскажу так, что все вздрогнут. Поэтому под катом — всё, что вы когда-либо хотели или не хотели спросить про мапперы, но боялись или вовсе даже и не собирались спрашивать.
▍ Жизнь до мапперов
В 1983 году на японский рынок вышла 8-битная игровая система Nintendo Famicom. Позже ставшая известной в разных частях планеты под множеством названий, включая Nintendo Entertainment System в США и Денди в странах СНГ. Хотя для многих она является символом самого что ни на есть начала эпохи видеоигр, на самом деле она была настоящим некст-геном своего времени: её появлению предшествовали два поколения игровых систем.
Лидерами предыдущего поколения были Atari 2600 (1977), Intellivision (1979) и ColecoVision (1982), продававшиеся миллионными тиражами. В нём игровые издатели уже регулярно пытались переносить самые передовые игры из аркадных залов на домашние консоли. Но игровые автоматы были значительно мощнее, и подобные адаптации получались лишь условно похожими на оригинальные игры.
Donkey Kong курильщика для Atari 2600 и ColecoVision
Nintendo, у которой уже был успешный опыт разработки и игровых автоматов, и домашних видеоигр (формата Pong), и интерактивных электронных игрушек (Game & Watch) поставила перед своими инженерами амбициозную задачу: принести в дома игроков графику высокого разрешения с качеством, максимально приближённым к аркадному. В частности, новая система должна была достойно воспроизводить хит самой Nintendo 1981 года, игру Donkey Kong. Эта задача действительно была выполнена.
Donkey Kong здорового человека для аркадного автомата и Famicom
Как и игровые консоли предыдущего поколения, Famicom использовал концепцию картриджей — легко заменяемого внешнего носителя-кассеты с игровыми программами, технически реализованного в виде печатной платы с микросхемами ПЗУ, что обеспечивало практически мгновенный запуск игр. Но реализация имела значительные отличия от предшественников, уникальные именно для этой платформы.
Картриджи предыдущих систем имели не очень большое количество контактов — 24 у Atari 2600, 40 у ColecoVision. Картридж Famicom имеет целых 60 контактов (и даже 72 у NES), на которые выведена значительная часть сигналов от различных компонентов архитектуры — шины адреса и данных процессора и видеоконтроллера, которые у Famicom полностью независимы друг от друга, а также некоторые другие сигналы, в частности, позволяющие манипулировать отображением графики. Но главное, что наверняка положительно повлияло на дальнейшую судьбу платформы — несмотря на применение ПЗУ, на разъёме картриджа также присутствуют и сигналы записи в каждый из видов памяти.
Разъём картриджа Famicom и его сигналы
Причины такого технического решения, конечно, достоверно неизвестны. Вероятно, оно связано с первоначальными планами Nintendo на создание более сложного устройства, практически компьютера, с клавиатурой и дисководом. От этих планов в процессе разработки отказались в пользу более бюджетного, а значит, массового продукта. Так или иначе, это решение сделало возможным оптимальное конфигурирование системы под конкретные игры, а также заложило потенциал для расширения возможностей в будущем.
Оптимальная конфигурация заключалась в возможности использования ПЗУ меньшего объёма для более простых игр — например, Galaxian (1984) от Namco имеет всего 8 килобайт ПЗУ кода, а Pac-Man (1984) и всеми любимый Battle City (1985) — по 16 килобайт.
Family Basic
Потенциал для расширения вскоре пригодился для дополнения Family Basic (1984), в котором начали воплощаться отвергнутые ранее планы Nintendo. Совместная с Hudson Soft и Sharp разработка превращала-таки Famicom в простейший персональный компьютер. Комплект состоял из внешней клавиатуры, опционального красного магнитофона от Panasonic, и картриджа с интерпретатором Бейсика. Картридж также содержал дополнительное ОЗУ с батарейным питанием для хранения программ — так заодно родилась и концепция встроенных сохранений в картриджных играх, которая продержалась на картриджных платформах до начала 2000-х годов.
Картридж Family Basic внутри. Энергонезависимая память на пальчиковых батарейках!
Полный же потенциал такой открытой архитектуры был раскрыт позже, ближе к концу 1980-х годов. За счёт появления и широкого использования пресловутых мапперов на том же самом железе удалось реализовать значительно более продвинутые игры, чем те одноэкранные аркады, для одомашнивания которых оно создавалось. Это позволило растянуть активную коммерческую жизнь платформы на рынке, на целых десять лет — от запуска в 1983 году в Японии и в 1985 году в США до 1995 года в Европе, когда вышла игра Lion King, последняя с официальной лицензией от Nintendo.
▍ Зачем нужны мапперы
В первые годы жизни Famicom и даже его вышедшей чуть позже американской версии, NES, игры укладывались в заложенный архитектурный лимит — 32 килобайта на код и 8 килобайт на графику. За это время аркадные игровые автоматы, являющиеся тогда остриём прогресса, только подкрепили тренд на усложнение содержания игр. Больше графики, больше уровней, более разнообразный игровой процесс. В двух словах — «bigger, better».
Аркадные версии игр Space Invaders, Pac-Man, Popeye
Количественный и качественный рост контента оформился уже в начале 1980-х. Сама Nintendo совершила переход от первых одноэкранных игр типа Breakout (1976), Space Invaders (1978) и Pac-Man (1980) к многоэкранным — Donkey Kong (1981) и Popeye (1982), в которых было уже несколько довольно сильно отличающихся локаций. А в 1985 году ей же был совершён следующий качественный переход, определивший лицо домашних видеоигр ещё на добрый десяток лет.
Разнообразие локаций в игре Super Mario Bros.
Игра Super Mario Bros явила миру новую концепцию платформера с плавным перемещением по уровням, не помещающимся в один экран. Она состояла из 8 миров по 4 уровня в каждом, имела весьма разнообразный и очень динамичный игровой процесс, полноценное музыкальное сопровождение, и хорошую, хотя и довольно однообразную графику. Так был достигнут предел возможностей Famicom в рамках имеющейся памяти. Чтобы продолжать повышать планку, было необходимо увеличить хранимый на внешнем носителе объём данных.
Проблемы расширения памяти на картридже
Почему же нельзя было просто так взять и установить в картридже больше памяти? Дело в том, что изначально такие объёмы просто не предусматривались в архитектуре системы. Ведь она задумывалась в годы становления игровой индустрии, когда будущее домашних видеоигр было довольно туманным и не было представления ни о том, какими они должны стать через несколько лет, ни о том, насколько долго игровые устройства смогут существовать на рынке до замены их следующим поколением.
Таким образом, если говорить максимально просто, маппер — такая штука, которая позволяет поставить больше памяти в картридж. Больше памяти — больше графики, анимации, музыки, уровней, и прочего содержания в игре, и в конечном счёте разнообразнее, красивее, лучше и интереснее игры. Или, чуть посложнее: маппер — это устройство, расположенное внутри каждого картриджа, позволяющее управлять памятью большего размера, чем было задумано изначально.
Одна из первых и одна из последних игр для Famicom
Однако, дальнейший сюжет развивается не так просто, как можно было бы подумать. Нет, Nintendo не взяла и создала пресловутый маппер для своих новых игровых хитов, и все жили долго и счастливо, пока не пришли 16 бит и не разогнали всех. На самом деле Nintendo делала ставку на совершенно иное устройство, не имеющее отношения к картриджам.
▍ Крутятся диски
Несколько лет назад Масаюки Уемура, в начале 1980-х возглавлявший разработку Famicom, рассказал, что одной из причин, почему был выбран именно процессор MOS 6502, была его малоизвестность в Японии — он не производился в стране и не применялся в местных разработках. В Nintendo надеялись, что у других компаний возникнут затруднения с изучением новой системы, и они не смогут быстро составить конкуренцию. Данный эпизод закладывает сохранившееся на многие годы отношение Nintendo к сторонним разработчикам игр для её платформ как к нежеланным гостям, и даёт понять, что последующие события были вполне закономерны.
Надежды компании некоторое время действительно оправдывались — в течении первого года жизни платформы. Только-только успели выйти первые игры от Hudson Soft, картриджи для которых производила сама Nintendo, и уже в конце 1984 года компания Namco — в то время сторонний разработчик, не имевший партнёрского соглашения с Nintendo — разобралась в технологии и выпустила свои игры на картриджах собственного производства. Вскоре к ней присоединились все кому не лень: Bandai, Irem, Jaleco, Konami, Sunsoft, Taito, и др.
Ровно трёхдюймовая дискета FDS. Рельефные буквы Nintendo являются частью механической защиты от нелицензионной продукции
Решением этой проблемы в глазах Nintendo стал свой возврат к первоначальной концепции: возник план создать дисковод для Famicom и выпускать игры на нестандартных трёхдюймовых (ровно, не трёх с половиной!) гибких магнитных дисках, производить которые третьим лицам было бы значительно сложнее. Таким образом, Nintendo могла бы сохранять полный контроль над собственной платформой, а заодно и снизить расходы на производство копий игр. Также это открыло возможности для альтернативных маркетинговых стратегий типа продажи чистых дисков и записи на них выбранных игр в специальных автоматах.
Famicom Disk System. Бело-красный Famicom сверху, чёрно-красный Disk System снизу
План воплотился в реальность в феврале 1986 года — на рынок вышло устройство Famicom Disk System (FDS). Помимо работы с дискетами, хранящими 112 килобайт данных и заодно позволяющими делать внутриигровые сохранения, оно расширяло и другие возможности консоли. В частности, добавлялся ещё один одноканальный, но более продвинутый звуковой синтезатор. В связи с появлением FDS в период с осени 1985 по осень 1987 игры самой Nintendo в Японии выходили исключительно на дискетах, и многие зародившиеся тогда и знаменитые ныне игровые серии, такие как Legend of Zelda, Metroid, Kid Icarus, и даже Castlevania, впервые увидели свет именно на FDS.
Просьба перевернуть диск в играх для FDS встречается гораздо чаще, чем хотелось бы
Как показала история, решение о смене носителя хотя и имело успех в ближайшие годы, в перспективе оказалось не особо удачным. Даже не говоря о надёжности и удобстве, оставляющих желать лучшего — дискеты нужно было постоянно переворачивать вручную! — оно жёстко ограничило объём игр, который продолжал расти и дальше. Забавно, но через годы Nintendo снова вернулась к тем же граблям, сначала выбрав картриджи вместо компакт-диска для своей Ultra 64 в 1996 году, а потом попытавшись сделать для неё магнито-оптический дисковод 64DD. Впрочем, это уже совсем другая история.
▍ Рождение мапперов
Тем временем оставшиеся в рамках картриджной технологии сторонние разработчики были вынуждены пойти своим путём, и в 1985 году появились первые две игры, использующие простейший маппер для увеличения максимального объёма графического ПЗУ — City Connection от Jaleco и Hyper Olympic Gentaiban! от Konami.
Плата картриджа с игрой Hyper Olympic Gentaiban!
В интернете есть разночтения по поводу первенства, но так или иначе, обе игры являются портами соответствующих аркад, они полностью разработаны и произведены сторонними разработчиками, и используют одинаковый по устройству маппер. Вскоре это решение, с сохранением программной совместимости, но улучшением аппаратной реализации, было позаимствовано и другими компаниями, Весной 1986 года появился первый маппер в виде заказной микросхемы, а не стандартной дискретной логики, и снова он был разработан сторонней компанией, Sunsoft, для её игры Atlantis no Nazo.
Плата картриджа с игрой City Connection
Той же весной аналог маппера City Connection создала и сама Nintendo. В дальнейшем эта тенденция сохранялась. Большое количество разнообразных мапперов с новыми, всё более продвинутыми возможностями, разрабатывалось для своих игр сторонними компаниями, после чего немного улучшенные аналоги некоторых из них появлялись и у Nintendo.
Одна из иллюстраций патента на MMC1
Практически все технические решения, использованные Nintendo в своих платформах, были запатентованы ей в Японии и США. Это касается и особенностей устройства NES, и в том числе мапперов. Так, US Patent 4,926,372 от 6 мая 1986 года описывает маппер UNROM, а US Patent 4,949,298 от 19 ноября 1986 описывает ранний вариант MMC1, несколько упрощённый в практической реализации. Срок действия патентов уже истёк, но в те времена их наличие с одной стороны, и отсутствие решений от Nintendo с другой, плюс острая конкуренция между собой, мешало сторонним разработчикам просто применять готовые решения и вынуждало постоянно изобретать свои велосипеды.
Японский период жизни Famicom показывает, что изначально технология мапперов, как, впрочем, и весь рынок видеоигр для платформы, развивались стихийно и никак не контролировались и не стандартизировались Nintendo, стратегия развития которой не предполагала ни появления других, независимых игроков на своём поле, ни даже продолжения поддержки картриджного формата.
▍ Licensed by Nintendo
С выходом на западный рынок видеоигр, ещё не оправившийся от краха 1983-1985 годов, для достижения успеха в этих непростых условиях, Nintendo решила контролировать свою платформу максимально жёстко.
В частности, каждому отдельно взятому издателю, независимо от репутации и заслуг — даже компании Atari, практически построившей саму индустрию видеоигр — было позволено выпускать максимум пять игр в год. Позже это породило несколько фантомных компаний (Ultra Games, Palcom, LJN после перехода к Acclaim), целью существования которых был исключительно обход ограничения.
Надпись Licensed by Nintendo в различных играх
Игры должны были оставаться эксклюзивом для платформы в течении двух лет, а для выпуска игры нужно было пройти сложный процесс лицензирования, получив пачку надписей Licensed by Nintendo в игре и на упаковке, в комплекте со строгой цензурой содержания игр. Готовые картриджи, вместе со всеми микросхемами в них, должны были закупаться у самой Nintendo (фактическим производством занимались подрядчики) по не самым выгодным ценам и в количестве не менее 10000 копий. Немногим компаниям, например Rare, удалось внедрить мапперы собственной разработки, но всё равно они производились с участием Nintendo.
В связи с этим некоторые изначально японские релизы сторонних компаний, использовавших мапперы их собственной разработки (Konami, Sunsoft, Namco, Taito и другие) при издании в США перерабатывались под мапперы Nintendo.
Например, наша любимая Contra была переделана с VRC2 под UNROM, при этом объём ПЗУ был урезан вдвое и из игры была убрана значительная часть оформления. Castlevania 3 была переделана с VRC6 на MMC5 и потеряла улучшенный саундтрек, а возможности этого нового, дорогого и очень мощного маппера остались практически незадействованными. В Hebereke (Uforia) маппер FME7 заменили на MMC3, а Power Blazer заодно с заменой экзотического маппера TC0190 на MMC3 был переделан настолько, что преобразился в совершенно другую игру — Power Blade.
Случались и обратные истории: британская игра Dragon’s Lair после выхода оригинального релиза в США была переделана с маппера UNROM на MMC3 для выпуска в Европе и Японии. При этом объём данных игры вырос вдвое, что, помимо прочего, позволило значительно ускорить её работу и сделать почти играбельной.
Один из немногих известных самодельных девкитов прошлых лет, так называемый Mission Control
С другой стороны, даже после запуска строгого механизма лицензирования, Nintendo не изменила своего отношения к сторонним компаниям. По свидетельствам некоторых западных разработчиков, у них не было ни официальной документации, ни тем более девкитов. В лучшем случае они располагали полученными окольными путями фотокопиями японской документации, а по большей части изучали платформу экспериментальным путём и разбором существующих игр, составляя свою собственную документацию и делая свои инструменты для разработки.
Не всех издателей и разработчиков устраивало такое положение дел. Некоторые — Tengen, Color Dreams, Sachen и другие — предпочли работать на полу-подпольном положении. Это было непросто, так как в американскую и европейскую версии консоли был добавлен чип региональной защиты, который должен был устанавливаться в каждый картридж, а получить его можно было только у Nintendo. Но со временем нашлись разные пути обхода этой защиты (включая очень занимательный казус с Бюро авторского права США), и нелицензированные разработчики присоединились к японским коллегам в деле создания всё новых мапперов, как своих собственных, так и копий «официальных».
Последствия политики Nintendo отразились на всей индустрии видеоигр, и ещё очень долго выход на рынок консольных игр оставался для небольших компаний гораздо менее доступным по сравнению с домашними компьютерами. Только в середине 2010-х годов ситуация начала меняться к лучшему.
Времена, когда кому-то всё же удавалось переиграть и уничтожить саму Nintendo
Ближе к закату популярности платформы в США и Европе эстафету приняли пираты. Скрещивая ежа и ужа, собирающие «разномапперные» игры в сборники, пиратящие как оригинальные игры, так и ранее спираченные коллегами, а позже и разрабатывая свои собственные, они наплодили немалое количество мапперов, начиная довольно точными копиями официальных и заканчивая совершенно экзотическими оригинальными разработками. История продолжается до сих пор, и каждый год в FCUEX появляется поддержка всё новых обнаруженных в пиратской продукции мапперов.
▍ Мапперы для народа
Зарубежные игроки познакомились с концепцией мапперов ещё во время активной коммерческой жизни платформы, посредством игровой прессы, в которых публиковалась информация про устройство картриджей и положительном влиянии этих устройств на качество игр — маркетинг в то время часто пытался задействовать реальные технические термины в качестве модных продающих словечек.
Статья Why Your Game Paks Never Forget в журнале Nintendo Power, январь 1991
Однако в этих публикациях термин «маппер» не встречается. В прессе встречалось обозначение MMC с расшифровкой «Memory Management Controller» — но это, вероятно, лишь импровизация журналистов на основе подсмотренного на платах и микросхемах картриджей обозначения. В патентах Nintendo использовался более стандартный технический термин «bank switching», а также встречается словосочетание «multi-memory controller», от которого, видимо, и произошло обозначение MMC. В сохранившейся приватной документации компании Color Dreams, датированной 1989-1990 годами, их собственный маппер называется просто «page select». Официальной же документации Nintendo на английском языке, по всей видимости, никогда не существовало, и, соответственно, официального термина не было.
В наше же время название «маппер» используется повсеместно, и несмотря на его зарубежное звучание, есть вероятность, что оно имеет отечественное происхождение.
В отечественное информационное пространство информация про мапперы проникла в эпоху первых программных эмуляторов Famicom/NES/Денди, появившихся во второй половине 1990-х годов. На тот момент она имела вполне прикладное значение, ведь эмуляторы поддерживали только ограниченное количество мапперов, а значит, запускали только часть существующих игр. Представление неискушённых в технике пользователей о мапперах в то время сводилось примерно к тому, что это некая микросхема внутри картриджа, и чем она лучше, тем круче игры. Это позволяло проводить аналогии с иными предметами компьютерной техники, обладающими подобными свойствами — лучший процессор, лучшая видеокарта, больше памяти. Последняя аналогия, кстати, довольно близка к истинной сути вещей.
Сейчас уже трудно сказать, какой эмулятор Famicom/NES появился первым, но наиболее вероятным кандидатом на эту роль является японский эмулятор Pasofami, разрабатывавшийся Nobuaki Andou с первой половины 1990-х годов, сначала для японского компьютера FM Towns, а в 1995-1996 годах и для PC с Windows. В те времена образы картриджей представляли собой два отдельных файла — дампы ПЗУ кода и ПЗУ графики, поэтому для запуска игр требовалась отдельная информация об используемом маппере. В документации к Pasofami это называлось просто Program Type, которых на тот момент поддерживалось всего шесть.
Вся информация, связанная с Pasofami, была доступна только на японском языке, что сильно осложняло его использование для западной аудитории. Однако его появление дало толчок к разработке первых западных эмуляторов. Два из них были разработаны нашими соотечественниками, Маратом Файзуллиным и Алексом Красивским. Краткий период их сотрудничества привёл к появлению в 1996 году эмулятора interNES, впоследствии известного как iNES, а с ним и одноимённого файлового формата с расширением .nes. В нём дампы всех ПЗУ картриджа объединены в один файл и снабжены 16-байтным заголовком, где помимо прочих параметров указан и тип используемого игрой маппера. Этот формат, ставший негласным стандартом, до сих пор является основным и поддерживается всеми эмуляторами. С 1996 года слово «маппер» начинает встречаться в описаниях устройства NES, в том числе в описании заголовка iNES и другой документации за авторством Файзуллина — например, в тексте Nintendo Entertainment System Architecture, от которого отталкивались многие другие авторы эмуляторов.
Таким образом, можно предположить, что повсеместно используемый в наше время термин «маппер» был введён в обиход именно авторами эмуляторов в середине 1990-х годов, и как минимум популяризирован, а, возможно, даже и предложен Маратом Файзуллиным.
В появлением формата iNES мапперы получили номера и названия, чтобы можно было как-то их различать. Происходило это стихийно, по мере обнаружения новых игр, плат и микросхем, поэтому никакой особой системы в нумерации нет. Некоторые мапперы имеют собственные названия, выбранные комьюнити разработчиков эмуляторов в зависимости от ситуации: по маркировке ASIC’ов на плате, по обозначению на плате, по названию компании-разработчика, или другим причинам.
Платы картриджей Nintendo могли иметь разные конфигурации с одним и тем же маппером, но отличающиеся объёмом микросхем памяти и особенностями их коммутации, и они имели свои собственные обозначения. Например, маппер MMC3 применяется в семействе из двух десятков плат — TLROM, TKROM, TNROM и многих других, известных под общим названием TxROM. Части из этих конфигураций в iNES был назначен номер 4, а некоторым — другие номера, например, 118 и 119.
▍ Как это работает
Центральный процессор Famicom может непосредственно обращаться только к определённому количеству адресов памяти. Оно определяется количеством линий шины адреса, которых 16 штук — это даёт 65536 возможных комбинаций. Однако часть из них используется для внутренних ресурсов системы: для обращений ко встроенному ОЗУ, управляющим регистрам видеоконтроллера и синтезатора звука. Сделано это не особо оптимально, и поэтому, несмотря на небольшой объём ОЗУ и количество регистров, им отведена целая половина адресного пространства — так в те времена было проще и дешевле. Вторая половина, соответственно, отдана под ПЗУ, которое находится на плате сменного игрового картриджа и содержит код игры. Таким образом, максимальный объём этого ПЗУ — 32 килобайта.
Аналогичная ситуация и с видеоконтроллером, который имеет собственное, полностью независимое от центрального процессора адресное пространство, к которому может обращаться только он. У видеоконтроллера всего 14 линий на адресной шине, что даёт 16384 возможных адресов, и только половина этого пространства используется для доступа к ПЗУ с игровой графикой, которое может иметь объём до 8 килобайт.
Стандартная карта памяти Famicom
Распределение адресов в адресном пространстве по их назначению называют картой памяти — как вы догадываетесь, на английском это называется memory map. Где-то в этой карте располагается ОЗУ, где-то регистры устройств, где-то ПЗУ с кодом. Маппер же, то есть mapper — от слова map — устройство, управляющее конфигурацией этой карты. Технически это управление реализовано простой коммутацией «лишних» разрядов шины адреса ПЗУ, и в простейшем случае представляет собой регистр-защёлку, выходы которой соединены с дополнительными адресными линиями ПЗУ.
Запись в регистр маппера мгновенно подключает в определённую область адресного пространства (так называемое «окно» или «слот») выбранный фрагмент («банк» или «страницу») ПЗУ. В современном мире нередко встречаются некорректные аналогии с загрузкой или подкачкой. Маппер не процессор, не дисковод и не файл подкачки — он ничего никуда не копирует и не загружает. Новые данные появляются в адресном пространстве сразу же в момент записи управляющих бит в регистр маппера, и скорость доступа к этим данным точно такая же, как к ПЗУ обычного размера.
В зависимости от конструкции, маппер может переключать не только фрагменты ПЗУ кода, но и ПЗУ графики. В этом случае видеоконтроллер также начинает получать данные из нового места сразу же при переключении. Таким образом, можно менять отображаемую графику прямо во время прохода луча развёртки по экрану — или всю целиком, или только определённую её часть. Это позволяет отобразить на экране больше графических элементов, чем возможно в стандартной конфигурации, а также открывает широчайшие возможности для «бесплатной» по вычислительным ресурсам анимации.
В силу устройства у маппера есть понятие гранулярности, а именно, размера переключаемых фрагментов памяти. Так как при переключении коммутируются только старшие адресные линии ПЗУ, а младшие остаются неизменными, их количество и определяет гранулярность, которая получается кратной степени двойки. Чаще всего это 16 или 8 килобайт для ПЗУ кода, но для ПЗУ графики это слишком много, ведь оно само имеет максимальный размер 8 килобайт. Поэтому для переключения банков графики типична гранулярность 8, 4, 2 и даже 1 килобайт. Чем меньше размер банка для графики, тем удобнее.
Помимо своей основной задачи — конфигурации карты памяти, которая может быть реализована множеством способов — маппер может предоставлять и дополнительные функции. Например, программируемый таймер, генерирующий прерывания для процессора с заданной частотой, дополнительное ОЗУ кода и данных с батарейкой или без, ОЗУ для графики тайлов или тайловых карт, некоторые улучшения для графики, или даже целый дополнительный звуковой синтезатор. Звуковые расширения, впрочем, актуальны только для Famicom, так как на NES их работа штатно не предусмотрена.
▍ Как используется
С тем, как можно переключать банки памяти, мы разобрались, но остался без ответа вопрос — зачем и когда это нужно делать.
Как правило, больше всего места в ПЗУ кода в играх занимают карты и прочие данные для описания уровней. Несколько меньше занимает музыкальное сопровождение, по паре-тройке килобайт на трек. Довольно много места может занимать и сам код игры, пару десятков килобайт. Соответственно, переключение банков кода может понадобиться для доступа к данным: к картам уровней, к музыкальным трекам и звуковым эффектам. Также в банках может находиться и дополнительный код, если он не помещается в один или два.
В ПЗУ графики в разных банках располагаются наборы элементов, из которых строится визуальное оформление уровней или отдельных экранов, а также спрайты персонажей. Банк для графики фона может переключаться относительно редко, а может, и часто — если нужно анимировать весь фон целиком, как это сделано, например, в игре Batman. Для спрайтов очень пригождается малая гранулярность, можно переключать набор элементов графики для одного персонажа, например героя, и таким образом анимировать его.
▍ Продолжение следует
Из-за большого объёма материала я решил разбить статью на две части — историческую и техническую. В продолжении рассмотрим особенности нескольких основных мапперов и их влияние на содержание игр, сложности программирования, а также ситуацию с мапперами на других платформах.
Помоги спутнику бороться с космическим мусором в нашей новой игре! ????
Комментарии (17)
SergeyNovak
10.01.2024 10:47Вики:
Впервые консоль появилась на японском рынке в 1983 году под названием Famicom, а затем, переименованная в NES, вышла в Европе и США в 1985 году.
Каким образом при переименовании приставки картриджи стали вместо 60 контактов на 72.
А самое главное, не описано хотя бы в двух словах с чем связано ограничение на память. Писать "не предусмотрено" на техническом ресурсе совсем уж не хорошо.Oangai
10.01.2024 10:47+1IMHO, у 8-ми битных адресное пространство всего-то 64kb, так еще и разработчики тогдашних архитектур часто не заморачивались и разбивали его по-братски, крупными кусками, так что всегда оставались люки. Потому что, на момент разработки, для поставленных руководством задач этого могло даже показаться больше чем достаточно, но вдруг очень быстро становилось так "всё равно слишком мало", что переделывать что-то уже не имело смысла, только менять процессор. В этом плане, mem-banking, то что автор назвывает маппер, был вполне компромисный и очень популярный костыль того времени.
tvoybro
10.01.2024 10:47+1Как пользователь технического ресурса, дочитавший до раздела статьи "Как это работает", могу, в нескольких словах, предположить, что данное ограничение связано с 16-битной адресацией процессора консоли.
SadOcean
10.01.2024 10:47+3Вероятно имеется в виду, что технически это одна аппаратная база, одни игры и т.д.
Так то консоли имели разный дизайн, несовместимые картриджи и разницу в оборудовании.
На самом деле даже американская и европейская nes были разными, потому что были адаптированы под PAL/SECAM или NTSC, в них даже различалась скорость одних и тех же игр из-за разной частоты кадров.
shiru8bit Автор
10.01.2024 10:47+4Изменения между Famicom/NES - это довольно большая тема, статья и так была огромная. В США поменяли концепцию, отошли от ассоциации с игрушкой, полностью переделали дизайн, изменили разъём, добавили региональную защиту.
Про причины ограничения написано. Разве это меньше двух слов?
Центральный процессор Famicom может непосредственно обращаться только к определённому количеству адресов памяти — оно определяется количеством линий шины адреса, которых 16 штук — это даёт 65536 возможных комбинаций.
bevice
10.01.2024 10:47В двух словах: 2^16=64k. В трех: у процессора MOS6502 всего 16 ног для выбора адреса, без хитростей он не может адресовать большее количество памяти.
Oangai
10.01.2024 10:47а вот создатели C64 напряглись и родили 6210, у которого уже был встроенный IO-Port на 6 бит, из которых 2 или 3 использовались как раз для банкинга
cybermind8801
10.01.2024 10:47+7Немного оффтопа - Hudson Soft, через 4 года после Famicom (описанного в статье) выпустившая в Японии совместно с NEC консоль PC Engine (также выпущенную в Америке под названием TurboGrafx-16), развила эта концепцию мапперов еще дальше - маппер тут встроен непосредственно сам в процессор HuC6280.
Данный процессор по сути является развитием процессора MOS 6502 (который без BCD-арифметики используется в составе процессора 2A03 в NES/Famicom). Он так же является 8-битным и имеет 64 КБ непосредственно адресуемой памяти. Но сама адресная шина процессора HuC6280 - 21-битная, и он может адресовать до 2 МБ памяти. Реализуется это за счет встроенного в процессор маппера, который делит эти 2 МБ на 256 участков по 8 КБ. Все адресное пространство в 64 КБ разделено на 8 участков по 8 КБ и на каждый участок можно отобразить любую из 256 страниц физической памяти, записав в специальный регистр номер страницы (регистров также 8, по числу участков).
Такая система позволила значительно упростить и уменьшить сами картриджи (в них содержится только ROM чип с игрой). Ну и в целом, для 8-битной системы потолок в 2 МБ оказался вполне себе достаточным - большинство игр на картриджах не превышали объем 512 КБ - 1 МБ.
serge-sb
10.01.2024 10:47+1А ещё маппинг (оперативки) был реализован и в IBM PC: EMM. Поначалу железно, а с появлением 386-го и софтварно.
Oangai
10.01.2024 10:47+1ровно наоборот: 80286 уже имели прообраз MMU и умели защищенный режим и page faults, но маппинга у них еще не было, он там делался как раз софтварно подкачкой по DMA. EMM для DOS эмулировал банкинг таким способом. У 386 и дальше был уже полноценный MMU с маппингом для отображения на физическую память. Но всёже, это не совсем то о чем автор пишет: тот древний банкинг выполнял отображение 1:N и имел смысл когда адресное пространство меньше доступной физической памяти. MMU делают отображение N:M из достаточно большого адресного пространства, большего чем машина может получить физически
pwl
10.01.2024 10:47Там же написано: IBM PC. При чем тут 286? Это было реализовано для 8086 с его 20 битной шиной адреса, с помощью специальных плат расширения, которые работали в точности как эти мапперы:
https://en.wikipedia.org/wiki/Expanded_memory
В 286 адресная шина была уже 24 бита, и смысла в аппаратном маппере уже не было.
Ну и занудства ради: page faults в 286 не было, в связи с отсутствием такой сущности как страницы. Были segmentation faults, которые тоже позволяли реализовать виртуальную память, но не так удобно, как появившиеся в 386 страницы.
imdragon
10.01.2024 10:47IBM PC - вообще шедевр инженерного гения, создавший огромную коллекцию "временных решений" но навсегда
Zara6502
году в 2003 один знакомый, пытаясь объяснить мне что такое маппер провёл аналогию с 3D ускорителем в ПК, с тех пор я только так их себе и представлял (не в контексте того что маппер=ускоритель 3D, а то что это устройство подключаемое к общей шине и дающее новый функционал.
там как тема nes для меня очень далёкая, то никогда не пытался разобраться в том прав ли был мой товарищ.
perfect_genius
Я понял так:
Пусть есть примитивный процессор, у которого 4-х битная шина адреса. 4 бита - это 16 возможных адресов памяти (два в четвёртой степени: 2^4 = 2*2*2*2 = 16).
Если этого не хватает, то добавить ещё 16 байт памяти бессмысленно - процессор фундаментально не сможет получить к ним доступ. Если бы он был пятибитным, то мог бы дотягиваться уже до 32-х байт памяти (два в пятой степени: 2^5 = 2*2*2*2*2 = 32).
В итоге пусть при записи в нулевой байт наша 16-байтная память переключается на другую, тоже 16-байтную! Вот так просто.
В коде это выглядит так:
Записываем в ячейку №1 число 13
Записываем в ячейку №0 число 1 //переключили на вторую страницу памяти
Записываем в ячейку №1 число 14
Записываем в ячейку №0 число 0 //переключили память обратно
Теперь у нас на двух страницах памяти (по 16 байт) в ячейках №1 разные числа - 13 и 14.
Нюансы: памяти у нас всё же не 16 байт, а 15, ведь нулевой байт теперь занят переключением страниц. И раз в байте 256 значений (8 бит), то и в нулевую ячейку нашей памяти можно записывать числа в этом диапазоне, а это возможность иметь 256 страниц памяти. 256 * 15 байт = 3840 байт памяти.
Да, доступ к любой ячейке не мгновенный, надо сначала записать номер страницы в нулевой байт. Если 3840 всё равно мало, то можно забрать ещё один байт из 16 - два байта дадут уже 65536 страниц памяти, но все они будут уже по 14 байт.
65536 * 14 = 917504 байт
Zara6502
ну мапперы не ограничиваются только памятью
perfect_genius
Я привёл пример как это физически возможно. Да, вместо переключения страниц памяти можно делать что угодно - хоть включать-выключать дополнительные звуки, 3D-чип, принтер и т.д.