hojjatjafary
hojjatjafary
خواندن ۶ دقیقه·۵ سال پیش

شاهکار مهندسی ساخت NES

همان طور که علاقمندان به بازی‌های کامپیوتری می‌دانند کنسول بازی Nintendo Entertainment System یا به اختصار NES که در ایران به نام میکرو شناخته می‌شود، با وجود این که در دوران خود خیلی قدرتمند محسوب نمی‌شد، یکی از موفق ترین کنسول های بازی است و تا سالها محبوبیت خود را حفظ کرد. پردازنده‌ی اصلی این کنسول یک میکروکنترولر Ricoh 2A03 با هسته‌ی پردازشی 6502 بود، فرکانس کارکرد حدود دو مگاهرتز و دقیقا دو کیلوبایت حافظه‌ی RAM داشت! بله فقط دو کیلوبایت! احتمالا بازی‌هایی دیده‌اید که دارای پیچیدگی و از نظر فنی بسیار چشمگیر هستند. ممکن هست برای همه سوال پیش بیاید که چطور با چنین محدودیتی می‌توان بازی های به این خوبی تولید کرد؟

اگر تعداد زیادی بازی NES انجام داده باشید متوجه تفاوت چشمگیر بازی‌ها در کیفیت گرافیکی و حجم محتوای بازی‌های مختلف شده‌اید. البته بعضی از آنها بازی‌هایی با بودجه‌های کم هستند. اما مقایسه‌ی بازی‌هایی که خود Nintendo در اوایل عرضه‌ی این کنسول منتشر کرده با بازی هایی که بعدا منتشر کرده نشان از تغییر خاصی دارد.

بازی‌های منتشر شده توسط نینتندو در اوایل تولید کنسول NES
بازی‌های منتشر شده توسط نینتندو در اوایل تولید کنسول NES


بازی‌هایی که بعدا نینتندو برای کنسول NES منتشر کرد
بازی‌هایی که بعدا نینتندو برای کنسول NES منتشر کرد

بازی‌های اولیه به خودی خود خیلی بد نیستند اما عناصر گرافیکی خیلی محدودی دارند. پس‌زمینه‌ها خیلی محدود و اکثرا خالی، سیاه یا تک رنگ هستند. تصاویر بازی‌های اولیه تقریبا نماینده‌ی تصاویر کل بازی هستند اما تصاویر بازی‌های بعدی فقط بخش کوچکی از گرافیکی است که می توانیم از آن در بازی لذت ببریم.

البته تفاوت و رشد چشمگیر این اختلافات به خاطر افزایش تجربه‌ی افرادی بود که روی این بازی‌ها کار می‌کردند. در طول آن دوران هنرمندان به این نتیجه رسیدند که تصاویر دارای خط حاشیه بهتر از تصاویر مسطح دیده می‌شوند. بازی Super Mario Bros 1 را با Super Mario Bros 3 مقایسه کنید که چقدر از لحاظ بصری تمیزتر است. این کاری بود که می‌توانستند از همان ابتدا انجام دهند اما باید آن را از طریق تجربه یاد می‌گرفتند. آنها همچنین یاد گرفتند که چطور منوها و واسط های کاربری بهتری بسازند.

اما بیشتر این تفاوت‌ها را نمی توان به حساب یادگیری و افزایش تجربه گذاشت. کنسول NES خیلی خوب طراحی شده بود، با کمترین سخت افزار خیلی مقرون به صرفه بود اما با یک برگ برنده‌ی عالی. کارتریج‌های بازی‌ها می‌توانستند شامل سخت افزاری برای توسعه‌ی توانایی‌های کنسول باشند.

اگر به کارتریج فیزیکی نگاه کنید می‌بینید که دارای یک رابط پهن با پایه‌های زیاد است. کنسول و کارتریج می‌توانند یک رابطه‌ی دو طرفه را از طریق این پین‌ها داشته باشند. این نوع رابطه تفاوت زیادی با مثلا دیسک‌های نوری مثل CD یا DVD دارد چون کنسول فقط می‌تواند از روی آن بخواند و نمی‌تواند بنویسد. اگر کارتریج را باز کنید می‌توانید کل صفحه مدار داخل آن را ببینید. این صفحه مدار می‌تواند شامل هر چیزی که می‌توان به یک کامیپوتر ۸ بیتیِ کامل متصل کرد باشد. حتی RAM بیشتر. در حقیقت این راهی بود که بعضی از بازی‌ها مثل Legend of Zelda برای پیاده سازی Save در بازی استفاده کرده بودند. این بازی یک RAM اضافی روی کارتریج خود داشت و یک باطری ساعت که باعث می‌شد زمانی که کارتریج به منبع تغذیه خارجی متصل نیست محتوای RAM در طول زمان حفظ شود.(با پیشرفت تکنولوژی ما از حافظه‌ی فلش استفاده می‌کنیم که نیازی به منبع تغذیه ندارد.)

کارتریج بازی زلدا
کارتریج بازی زلدا

گفتیم که NES دو کیلوبایت حافظه‌ی RAM داخلی داشت اما این بدین معنا نیست که فقط می‌تواند دوکیلوبایت را شمارش کند. NES پنجره‌ی فضای آدرس بزرگی دارد که در دسترس کارتریج است تا از آن استفاده کند. به طور خاص یک پنجره‌ی ۳۲ کیلوبایتی برای کد برنامه‌ی بازی و یک پنجره‌ی ۸ کیلوبایتی برای گرافیک آن وجود داشت. این پنجره‌ها می توانند توسط ROM (حافظه‌ی فقط خواندنی) یا RAM روی کارتریج پر شوند. خود NES هیچ اطلاعی از آن ندارد و برایش مهم نیست. جادو واقعی اینجاست: یک کارتریج می تواند بیش از ۳۲ کیلوبایت کد یا ۸ کیلوبایت گرافیک داشته باشد. فقط باید کد و گرافیک به صورت قطعه هایی به داخل و بیرون جایگزین شوند. که این کار را کارتریج باید خودش و توسط میکروکنترلی که روی آن قرار دارد و به ROM و RAM متصل است انجام دهد. به این میکرو کنترلر Mapper گفته می‌شود. (کلمه‌ی Mapper به مفهوم Memory Mapping اشاره می‌کند)

بازی Super Mario Bros 1 یکی از آموزنده ترین بازی‌ها برای بررسی است، چون یکی از پیچیده‌ترین بازی های NES است که می‌توان بدون داشتن یک Mapper خاص ساخت. نینتندو به Mapperها Memory Management Controllers یا به اختصار MMC می‌گوید. زمانی که یک کارتریج MMC0 داشته باشد به این معناست که هیچ گونه چیز خاصی برای جابه جایی داده‌ها بین چیپ‌های مختلف RAM و ROM ندارد. اگر به فایلهای ROM که در شبیه سازهای NES استفاده می‌شود نگاه کنید، خواهید دید که اندازه‌ی فایل بازی Super Mario Bros 1 دقیقا ۴۱ کیلوبایت است. یک کیلوبایت را از آن کم کنید چون مربوط به Header فایل است تا شبیه‌ساز بداند که چگونه باید فایل را بارگیری کند. ۴۰ کیلوبایت باقی می‌ماند که ۳۲ کیلوبایت آن برنامه‌ی ROM و ۸ کیلوبایت آن ROM گرافیک است. که دقیقا پنجره‌ی حافظه‌ی کارتریج را پر می‌کند.

۸ کیلوبایت گرافیک به چه درد می خورد؟ دقیقا می‌شود ۵۱۲ خانه یا tile که هر یک ۸x۸ پیکسل هستند و فقط چهار رنگ در هر خانه پشتیبانی می‌شود. این ۵۱۲ خانه به دو صفحه تقسیم می‌شوند: ۲۵۶ خانه برای sprite ها و ۲۵۶ خانه برای پس زمینه. بازی Super Mario Bros 1 یک کلاس پیشرفته آموزشی است برای رسیدن به بیشترین gameplay با کمترین مولفه‌های گرافیکی. یک مثال معروف بوته‌ها و ابرها است که دقیقا از خانه‌های گرافیکی یکسانی ساخته شده‌اند که فقط پالت رنگ مختلفی روی آنها اعمال شده است.

در واقع دهها Mapper توسعه یافته است و هم اکنون و تا امروز توسط کپی کنندگان غیر مجاز یا علاقمندان در خانه در حال توسعه است. طبیعت کاملا plug-and-play به معنای این است که هیچ چیز نمی‌تواند فرد را در ساختن یک Mapper جدید با ویژگی‌های جدید متوقف کند، و NES با خوشحالی کار خواهد کرد. یکی از دلایلی که اکثر شبیه سازها با بازی های مبهم یا کپی شده مشکل دارند همین است که مجبورند برای همه‌ی Mapper ها کار خاصی را انجام دهند و علاوه بر شبیه سازی خود NES چیپ های Mapper را نیز شبیه سازی کنند. البته بعضی Mapper ها نسبت به بقیه بسیار معمول تر هستند، بسیاری از بازی‌های شناخته شده از MMC1 و MMC3 استفاده می‌کنند.

بازی Super Mario Bros 3 از MMC3 استفاده می‌کند. اگر به فایل ROM آن نگاه کنید حجم کمی کمتر از ۴۰۰ کیلوبایت دارد. بخش کمی از آن یعنی حدود ۱۲۸ کیلوبایت مربوط به صفحه‌های مختلف گرافیک است. بازی SMB3 تنوع گرافیکی بسیار بسیار بیشتری نسبت به SMB1 دارد. به جای این که جهان‌های مختلف مکان‌های یکسانی باشند که فقط رنگشان تغییر کرده واقعا مکان‌های کاملا متفاوتی به نظر می آیند. بقیه ۲۵۶ کیلوبایت شامل همه‌ی کدهای برنامه و داده‌های غیر گرافیکی مثل موسیقی است. تکرار می‌کنم که تنها ۳۲ کیلوبایت از این داده ها می‌توانند در هر زمان بارگیری شده باشد. کد بازی در حال اجرا به میکروکنترلر Mapper می‌گوید که چه تغییراتی باید انجام دهد.

در مورد MMC3 نکات بیشتری نسبت به این که فقط کار جایگزینی حافظه را آسان می‌کند وجود دارد. این Mapper یک ویژگی سخت افزاری کاملا جدیدی را به NES اضافه می‌کند. پشتیبانی داخلی NES برای Timer ها به شدت محدود است. MMC3 تایمر خود را دارد که می‌توان برای ایجاد جلوه‌های ویژه‌ی گرافیکی از آن استفاده کرد.

تا الان متوجه شدیم که کارتریج ها چطور با استفاده از سخت افزاری که خود حمل می‌کنند قابلیت های کم NES را ارتقا می‌دهند. ممکن است به این فکر کنید که چرا همیشه این کار را نمی کردند؟ چرا Super Mario Bros 1 از همان Mapper قدرتمند Super Mario Bros 3 استفاده نمی‌کرد؟

پاسخ هزینه اقتصادی است. چیپ‌های RAM و ROM قیمت قابل توجهی داشتند، اما این هزینه در طول عمر NES به سرعت کاهش پیدا کرد. هر سال شما می‌توانستید میزان بیشتری از ROM را روی کارتریج خود با همان قیمت پارسال داشته باشید. از این روی طراحی Super Mario Bros 1 که دقیقا پنجره‌ی حافظه‌ی کارتریج را پر می‌کرد و حتی یک بایت هم بیشتر نبود بهترین تصمیم اقتصادی در آن زمان بود. اما طراحی خردمندانه‌ی کارتریج NES باعث شد که بازی‌ها بتوانند به طور پیوسته بزرگتر و پیچیده‌تر شوند.

منابع:

https://abad1dea.tumblr.com/post/187429390285/roms-and-mappers-why-nes-games-can-be-so
http://wiki.nesdev.com/w/index.php/Nesdev_Wiki
https://en.wikipedia.org/wiki/Nintendo_Entertainment_System
https://en.wikipedia.org/wiki/Super_Mario_Bros.






بازیبازی‌کامپیوتریبرنامه‌نویسیبرنامه نویسیمیکروکنترولر
کسی که می خواهد برنامه نویس بماند، برنامه نویس شرکت فن افزار، بازی ساز، گرشاسپ راز اژدها، شمشیر تاریکی...
شاید از این پست‌ها خوشتان بیاید