Pull to refresh

Comments 19

году в 2003 один знакомый, пытаясь объяснить мне что такое маппер провёл аналогию с 3D ускорителем в ПК, с тех пор я только так их себе и представлял (не в контексте того что маппер=ускоритель 3D, а то что это устройство подключаемое к общей шине и дающее новый функционал.

там как тема nes для меня очень далёкая, то никогда не пытался разобраться в том прав ли был мой товарищ.

Я понял так:

Пусть есть примитивный процессор, у которого 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 байт

ну мапперы не ограничиваются только памятью

Я привёл пример как это физически возможно. Да, вместо переключения страниц памяти можно делать что угодно - хоть включать-выключать дополнительные звуки, 3D-чип, принтер и т.д.

Вики:

Впервые консоль появилась на японском рынке в 1983 году под названием Famicom, а затем, переименованная в NES, вышла в Европе и США в 1985 году.

Каким образом при переименовании приставки картриджи стали вместо 60 контактов на 72.

А самое главное, не описано хотя бы в двух словах с чем связано ограничение на память. Писать "не предусмотрено" на техническом ресурсе совсем уж не хорошо.

IMHO, у 8-ми битных адресное пространство всего-то 64kb, так еще и разработчики тогдашних архитектур часто не заморачивались и разбивали его по-братски, крупными кусками, так что всегда оставались люки. Потому что, на момент разработки, для поставленных руководством задач этого могло даже показаться больше чем достаточно, но вдруг очень быстро становилось так "всё равно слишком мало", что переделывать что-то уже не имело смысла, только менять процессор. В этом плане, mem-banking, то что автор назвывает маппер, был вполне компромисный и очень популярный костыль того времени.

Как пользователь технического ресурса, дочитавший до раздела статьи "Как это работает", могу, в нескольких словах, предположить, что данное ограничение связано с 16-битной адресацией процессора консоли.

Вероятно имеется в виду, что технически это одна аппаратная база, одни игры и т.д.

Так то консоли имели разный дизайн, несовместимые картриджи и разницу в оборудовании.
На самом деле даже американская и европейская nes были разными, потому что были адаптированы под PAL/SECAM или NTSC, в них даже различалась скорость одних и тех же игр из-за разной частоты кадров.

Изменения между Famicom/NES - это довольно большая тема, статья и так была огромная. В США поменяли концепцию, отошли от ассоциации с игрушкой, полностью переделали дизайн, изменили разъём, добавили региональную защиту.

Про причины ограничения написано. Разве это меньше двух слов?

Центральный процессор Famicom может непосредственно обращаться только к определённому количеству адресов памяти — оно определяется количеством линий шины адреса, которых 16 штук — это даёт 65536 возможных комбинаций.

статья интересная, спасибо, и тема интересная очень

В двух словах: 2^16=64k. В трех: у процессора MOS6502 всего 16 ног для выбора адреса, без хитростей он не может адресовать большее количество памяти.

а вот создатели C64 напряглись и родили 6210, у которого уже был встроенный IO-Port на 6 бит, из которых 2 или 3 использовались как раз для банкинга

Немного оффтопа - 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 МБ.

А ещё маппинг (оперативки) был реализован и в IBM PC: EMM. Поначалу железно, а с появлением 386-го и софтварно.

ровно наоборот: 80286 уже имели прообраз MMU и умели защищенный режим и page faults, но маппинга у них еще не было, он там делался как раз софтварно подкачкой по DMA. EMM для DOS эмулировал банкинг таким способом. У 386 и дальше был уже полноценный MMU с маппингом для отображения на физическую память. Но всёже, это не совсем то о чем автор пишет: тот древний банкинг выполнял отображение 1:N и имел смысл когда адресное пространство меньше доступной физической памяти. MMU делают отображение N:M из достаточно большого адресного пространства, большего чем машина может получить физически

Там же написано: IBM PC. При чем тут 286? Это было реализовано для 8086 с его 20 битной шиной адреса, с помощью специальных плат расширения, которые работали в точности как эти мапперы:

https://en.wikipedia.org/wiki/Expanded_memory

В 286 адресная шина была уже 24 бита, и смысла в аппаратном маппере уже не было.

Ну и занудства ради: page faults в 286 не было, в связи с отсутствием такой сущности как страницы. Были segmentation faults, которые тоже позволяли реализовать виртуальную память, но не так удобно, как появившиеся в 386 страницы.

ну простите, мог чего запамятовать с формулировками по старости, мы википедиям не обучены, всё больше сами.

На самом деле, кому бы эти карты тогда сдались для PC или XT их делать, там шина восьмибитная и ценовой сегмент не тот чтоб юзеры заценили, в PC даже предусмотренные 512Кб чаще всего не дозаполнялись, дорого было. Были карты расширения с банками, были, года с 84-го вроде, но уже под AT на 16-битную шину и изначально только для Лотуса123, потом уже находились умельцы это дело хотя-бы под RAM- диск задействовать. Но популярности особой не имели, поэтому никакой другой известный мне софт их не знал и не поддерживал, так что RAM- диск это был максимум на что их можно было применить.

В самой DOS поддержка этого дела появилась только с 4.0 в 88м году, а в массы пошла уже с 5.0 в 91м, когда уже даже AT ушли с рынка, только у нищебродов вроде меня использовались парочка. А на AT- матерях уже были юзабельные SIPP- коннекторы для почти привычных сейчас DRAM- плашек (правда, конектор на плашке был папа, на мамке мама). Это было уже дешевле и шустрее чем через общую шину гонять.

К слову сказать, чтобы в DOS хоть какие-то расширения памяти в окнах выше 0xA0000 из программ использовать, требовалось или программе точно знать что оно там есть, что только для узкоспециализированных кейсов и софта годилось, или использовать досовкий аллокатор (malloc/free), который там только с версии 5.0 появился (возможно в 4.0, но то был зверь редкий, не застал, не знаю). Сам, когда первый год примерно кодил еще под 3.3, точно помню что его там еще не было. Весьма возрадовался, когда пятёрку завезли.

IBM PC - вообще шедевр инженерного гения, создавший огромную коллекцию "временных решений" но навсегда

В Спектруме 128 в 86-м году уже использовали подобное...

Sign up to leave a comment.