هنوز هم صدای روشن شدن کنسول و آن لوگوی آبیرنگ سگا که با اقتدار روی صفحهی تلویزیونهای قدیمی نقش میبست، برای خیلی از ما یادآور شیرینترین خاطرات دوران کودکی است. روزهایی که با دستههای سیمی در دست، ساعتها غرق در دنیای «سونیک»، «مورتال کامبت» یا «شورش در شهر» میشدیم و آن نوارها (کارتریجها) دنیای ما را میساختند.
اما پشت این دنیای رنگارنگ و هیجانانگیز، چه چیزی نهفته بود؟ آن جعبهی مشکی و مستطیلی که در اتاقهای ما جای داشت، چطور میتوانست چنین گرافیک و صدای پیشرویی را در آن دوران تولید کند؟ در این مطلب، میخواهیم کمی از دنیای خاطرات فاصله بگیریم و با نگاهی فنی، داخل این کنسول افسانهای برویم. قصد داریم ساختار سختافزاری و معماری مگادرایو را کالبدشکافی کنیم تا ببینیم مهندسان سگا چطور با ترکیب نبوغ و فناوری، کنسولی را خلق کردند که استانداردهای بازیهای ویدیویی را در دههی ۹۰ میلادی تغییر داد.
این مقاله به دو بخش تقسیم میشود: در بخش نخست، اجزای سختافزاری مگادرایو و کارکرد هر یک از آنها به اختصار تشریح خواهد شد. در بخش دوم، با رویکردی فنی، فرآیند راهاندازی (Boot Sequence) کنسول را کالبدشکافی میکنیم؛ یعنی تمام اتفاقات و تبادل دادههایی که از لحظهی فشردن دکمهی پاور تا اجرای کامل کد بازی صورت میپذیرد.
نام SEGA در واقع مخفف عبارت SErvice GAmes میباشد. شرکت Service Games در سال 1940 توسط سه بنیانگذار در آمریکا تاسیس شد و کارش ساخت دستگاههای سرگرمی برای پایگاههای نظامی آمریکا در ژاپن بود! در دههی 1950 فعالیت شرکت به ژاپن منتقل شده و در سال 1965 با یک شرکت ژاپنی ادغام شد و نام آن به SEGA Enterprises تغییر یافت. کنسول بازی Sega Mega Drive اولین بار در سال 1988 توسط هیدکی ساتو که مهندس ارشد سختافزار سگا بود طراحی شد و در ژاپن عرضه شد و در سال 1989 با نام تجاری Sega Genesis وارد بازار آمریکا شد. دلیل این تغییر نام این بود که نام Mega Drive قبلا توسط شرکت دیگری تجاری شده بود و قابل استفاده نبود. به همین ترتیب این کنسول در سال 1990 به بازار اروپا و برزیل راه پیدا کرد. نکتهی جالب این است که این کنسول هنوز هم در برزیل به طور رسمی تولید و فروخته میشود!

کنسول بازی سگا مگا درایور – نسخهی ژاپنی

کنسول بازی سگا مگا درایور – نسخهی آمریکایی

کنسول بازی سگا مگا درایور – نسخهی اروپایی
قلب این کنسول را پردازندهی قدرتمند Motorola 68000 تشکیل میدهد. 68000 یک پردازندهی 16 بیتی است که در سال 1979 توسط شرکت موتورولا ساخته و معرفی شد.
علاوه بر این پردازنده، مگادرایو از دو پردازندهی کمکی دیگر با نام Z80 برای پردازش و تولید صدا و VDP (Video Display Processor) برای تولید تصویر تشکیل شده است. Z80 یک پردازندهی 16 بیتی از شرکت Zilog است و VDP نیز پردازندهی YM7101 از شرکت Yamaha است. در واقع 68000 خودش صدا و تصویر تولید نمی کند و به VDP و Z80 دستور می دهد که تصویر و صدای مورد نیاز را تولید کنند. جالب اینجاست که Z80 هم خودش صدا تولید نمی کند و با استفاده آی سی YM2612 از شرکت Yamaha و SN76489 از شرکت Texas Instruments صدا را تولید میکند.
در کنار VDP سه حافظهی RAM با نامهای VRAM، CRAM و VSRAM قرار گرفته است. VRAM برای ذخیرهی دادههای تصویر، CRAM برای ذخیرهی دادههای رنگ و VSRAM برای ذخیرهی بخشهای مختلف تصویر در هنگام اسکرول کردن میباشد.
برای تبدیل خروجی تصویر دیجیتالی پردازندهی VDP به خروجی آنالوگ برای ارسال به تلویزیون، از یک RGB Encoder با نام Sony CXA1145 استفاده شده است.
در شکل زیر برد اصلی کنسول به همراه علامتگذاری بخشهای مختلف نمایش داده شده است.

بخشهای مختلف مادربورد کنسول بازی سگا مگادرایو
در این بخش توضیح میدهیم که وقتی که دکمهی پاور فشرده میشود و جریان برق به مدارات روی برد میرسد تا زمانی که اولین تصویر بازی سونیک نمایش داده میشود چه اتفاقاتی میافتد.
آداپتور همراه برد که به عنوان تغذیهی برد استفاده میشود، ولتاژ متناوب 220 ولت شهری را دریافت میکند و آن را به ولتاژ مستقیم 9 ولت تبدیل میکند. با فشردن دکمهی پاور کنسول، این ولتاژ 9 ولت، در اولین مرحله وارد مدار تغذیهی روی برد میشود تا به ولتاژ 5 ولت تبدیل شود. علت این تبدیل ولتاژ این است که همهی آیسیهای موجود بر روی برد با ولتاژ 5 ولت کار میکنند.
با پایدار شدن خروجی مدار تغذیه، یک ولتاژ ریست به همهی پردازندهها یعنی motorola 68000، Z80 و VDP ارسال می شود. این سیگنال ریست باعث میشود وضعیت داخلی این پردازندهها به حالت اولیه بازگردد.
بعد از برداشته شدن ریست، پردازندهی 68000 شروع به اجرا میکند. این پردازنده به دنبال اولین دستور در آدرس 0x000000 میگردد. این آدرس متناظر با حافظهی کارتریج ROM (یعنی همان نوار بازی که داخل دستگاه گذاشته شده است، میباشد). حالا این سوال پیش میآید که طبق چه قاعدهای آدرس 0x000000 به کارتریج متناظر میشود. این قاعده را مفهومی به نام Memory Mapping مشخص میکند.
باس آدرس پردازندهی 68000 یک خط 24 بیتی است؛ بنابراین می تواند از 0x000000 تا 0xFFFFFF یعنی را آدرسدهی کند. این فضای آدرسدهی به چندین بخش به شرح جدول زیر تقسیم شده است.
|
ظرفیت |
نام فضا |
فضای آدرس |
|
4 MB |
Cartridge ROM |
0x000000 – 0x3FFFFF |
|
64 KB |
Z80 Address Space |
0xA00000 – 0xA0FFFF |
|
32 Byte |
I/O Registers |
0xA10000 – 0xA1001F |
|
1 Byte |
Z80 Bus Request |
0xA11100 |
|
1 Byte |
Z80 Reset |
0xA11200 |
|
32 Byte |
VDP |
0xC00000 – 0xC0001F |
|
64 KB |
Main RAM |
0xFF0000 – 0xFFFFFF |
برای مثال 68000 برای نوشتن داده در حافظهی رمِ Z80 ابتدا روی باس آدرس، مقدار 0xA11100 را که معادل Z80 Bus Request است، قرار میدهد. باس آدرس به یک Address Encoder میرود و انکدر تشخیص میدهد که این آدرس مربوط به Z80 است. پس بیت CS (Chip Select) پردازندهی Z80 را فعال میکند و بیت CS بقیه را غیر فعال میکند. Z80 این آدرس را دریافت میکند و متوجه میشود که 68000 قصد دارد داده روی رم آن بنویسد. بنابراین باس دادهی خود را آزاد و آمادهی دریافت داده از 68000 میکند. 68000 شروع به قرار دادن آدرس روی باس آدرس (در محدودهی Z80 Address Space) و داده روی باس داده میکند. Z80 این دادهها را دریافت میکند و داخل رم خود قرار میدهد.
خب حالا که با مفهوم Memory Mapping آشنا شدیم، بر میگردیم به ادامهی مطلب. گفتیم که با آزاد شدن ریست، 68000 به دنبال دادهی موجود در آدرس صفر میگردد. برای اینکار آدرس 0x000000 را روی باس آدرس قرار می دهد و دیکدر آدرس با توجه به اینکه این آدرس متعلق به کارتریج است آن را فعال میکند و بقیهی بخشها را غیر فعال میکند. در این آدرس، محل حافظهی استک نوشته شده است. سپس محل شروع اولین خط برنامهی بازی را از آدرس 0x000004 میخواند.
اجرای کد اولیهی بازی
اکنون کد داخل کارتریج اجرا میشود. اولین کاری که 68000 انجام میدهد، مقدار دهی اولیهی VDP است. VDP دارای رجیسترهای کنترلی است که 68000 از طریق این رجیسترها با آن صحبت میکند. دوتا از مهمترین رجیسترها، VDP data در آدرس 0xC00000 و VDP control در آدرس 0xC000004 است. 68000 با استفاده از این رجیسترها رزولوشن را انتخاب میکند. محل اسپرایتها (Sprite) را تنظیم میکند و وقفهها (Interrupt) را فعال میکند. اسپرایتها شامل کاراکترها، گلولهها، اشیاء و … میشود.
تنظیم حافظهی VRAM
سپس CPU دادههای گرفیکی را به VRAM منتقل میکند. قبل از اینکه توضیح بدهیم که این دادههای گرافیکی چه چیزهایی هستند، ابتدا در مورد نقش VDP و علت نیاز به آن توضیح میدهیم.
فرض کنید هدف، نمایش تصویر زیر باشد.

یک نمونه تصویر از محیط بازی SONIC
در نگاه اول احتمالا فکر میکنیم که پردازندهی 68000، تک تک پیکسلهای این تصویر را در هر فریم میسازد و سپس نمایش میدهد. اما اگر دقت کنیم، میبینیم که بسیاری از اشیاء و منظرهها در این تصویر ثابت هستند و فقط تکرار میشوند، مثلا پسزمینهی این تصویر، یک تصویر طولانیتر است که پیمایش میشود و وقتی به انتهای تصویر رسیدیم، دوباره از نوع تکرار میشود. تصویر پسزمینه در شکل زیر نشان داده شده است. به این تصویر اصطلاحا Background گفته میشود.

لایهی Background
خود این تصویر از تعدادی بلوک (Tile) تشکیل شده است. در واقع این تصویر به صورت تعدادی تایل در حافظهی کارتریج ذخیره میشود. هر تایل میتواند 8×8 پیکسل که هر پیکسل چهار بیت دارد، باشد. یعنی در مجموع هر تایل 32 بایت حافظه را اشغال می کند. برای مثال تعدادی از تایلهای تصویر بالا در شکل زیر نشان داده شده است.

تعدادی از تایلهای تصویر Background
سپس یک لایه تصویر دیگر داریم که شامل درختهای نخل و گلهای آفتابگردان میشود. این لایه که در شکل بعدی نشان داده شده است بر روی لایهی Background قرار می گیرد و همراه با حرکت کاراکتر SONIC این لایه هم حرکت میکند. به این لایه اصطلاحا Foreground گفته می شود. البته این لایه همیشه یکسان و تکرار شونده نیست و ممکن است در بعضی از جاها مثل جاهایی که پل بر روی رودخانه وجود دارد، تغییر یابد.

لایهی Foreground
لایهی بعدی، لایهای است که فقط حاوی متن است و گاهی اوقات تغییر میکند. مثل بخش محاسبهی امتیاز و تعداد جان باقیماندهی SONIC. به این لایه اصطلاحا Window گفته میشود.

لایهی Window
لایهی آخر لایهی Sprites هست. Sprite ها به کاراکترهای و اشیاء بازی گفته میشود که حرکت میکنند و تغییر شکل میدهند. مثل کاراکتر SONIC که اشکال مختلف شامل راه رفتن، دویدن، پریدن به بالا و پایین آمدن دارد یا حلقههای طلایی که به دور خود میچرخند و ماهی هایی که به بالا و پایین میروند.
تعدادی از اسپرایت های موجود در بازی SONIC در شکل زیر نشان داده شده است.

تعدادی از اسپرایتهای بازی SONIC
خب حالا برمی گردیم سراغ نقش VDP. این پردازنده وظیفهی ساختن تصویر نهایی را با استفاده از قرار دادن لایههای مختلف بر عهده دارد. این پردازنده میتواند دو لایهی ثابت با نامهای Plan A و Plan B را بر روی هم قرار دهد که در اینجا معادل لایههای Background و Foreground میباشد. از یک لایه Window پشتیبانی میکند و میتواند تا 80 اسپرایت را نمایش دهد. اندازهی اسپرایتها میتواند 8×8، 16×16، 32×32 و 64×64 باشد. پردازندهی مرکزی یعنی 68000 تنها با ارسال دستوراتی به VDP میگوید که الان کدام اسپرایت را در کدام موقعیت قرار بدهد و لایههای Background و Foreground به چه مقدار پیمایش (Scroll) شوند و مقادیر لایه Window چگونه تغییر یابد.
حافظهی VRAM
برای ساختن تصاویر، 68000 باید دادههای مربوط به لایهها و اسپرایتهای موجود در حافظهی کارتریج را وارد حافظه VRAM کند. اینکار به دو شکل انجام میشود. روش اول به اینصورت است که 68000 دادهها را یکییکی از کارتریج بخواند و سپس به VDP بدهد تا VDP نیز آنها را در VRAM ذخیره کند که خیلی کند است، روش دوم استفاده از ماژول DMA پردازندهی VDP است. با استفاده از DMA میتوان دادهها را مستقیما و بدون اینکه 68000 و VDP درگیر شوند، از کارتریج به VRAM منتقل کرد. کافی است که 68000 آدرس خانهی شروع دادهها در کارتریج و تعداد آنها را به VDP اعلام کند تا عملیات انتقال انجام شود.
حافظهی CRAM و سیستم رنگ
سیستم رنگ در این کنسول به صورت RGB و به ازای هر رنگ 3 بیت میباشد. یعنی در مجموع میتوان 512 رنگ تولید کرد. اما همانطور که قبلا گفتیم پیکسل ها 4 بیتی هستند. در نتیجه این سوال پیش میآید که چگونه با 4 بیت میتوان از بین 512 رنگ انتخاب کرد. اینجا مفهوم پالت رنگ به وجود میآید. پالتهای رنگ محل ذخیرهی کد RGB 9 بیتی رنگها هستند. هر پالت حاوی 16 رنگ میباشد و در مجموع میتوان 4 پالت رنگ تعریف کرد که در حافظهی CRAM ذخیره میشوند. در نتیجه 4 بیت مربوط به هر پیکسل، شمارهی رنگ موردنظر از میان 16 رنگ یک پالت مشخص را انتخاب میکنند. از آنجایی که حافظهی CRAMتنها ظرفیت 4 پالت رنگ دارد، در هر فریم تنها 64 رنگ متفاوت میتوان استفاده کرد.
نمایش تصویر
بعد از اینکه 68000 محل هر تایل از تصاویر لایههای Background و Foreground و مقادیر Window و محل اسپرایتها در صفحه را مشخص کرد، VDP تصویر فریم موردنظر را به صورت دیجیتال میسازد و آن را به RGB Encoder میدهد تا اطلاعات دیجیتال به آنالوگ تبدیل شود و در نمایشگر پخش شود.
تولید صدا
پردازندهی اصلی 68000 معمولاً مشغول منطق بازی، گرافیک و ورودیهاست و از آنجایی که تولید موسیقی و افکت صوتی نیاز دارد به صورت مداوم انجام شود، اگر همهی کارها با 68000 انجام شود، بخشی از زمان پردازندهی اصلی گرفته میشود. بنابراین 68000 برای صدا، فرمانهایی بهZ80 میفرستد و سپس Z80 رجیسترهای چیپهای صدا را تنظیم میکند. Z80 برای تولید صدا از دو آی سی YM2612 و PSG استفاده میکند.
YM2612
YM2612 مهمترین چیپ صدای Mega Drive است. این چیپ ساخت Yamaha است و بر پایهی FM Synthesis کار میکند. این همان چیزی است که صدای معروف و خشن Mega Drive را میسازد. مشخصات کلی YM2612 در جدول زیر آورده شده است.
|
مقدار |
ویژگی |
|
FM Synthesis |
نوع سنتز |
|
6 کانال |
تعداد کانالها |
|
4 اپراتور |
اپراتورها در هر کانال |
|
حدود 53 کیلوهرتز در NTSC |
نرخ نمونهبرداری داخلی تقریبی |
|
Stereo |
خروجی |
FM Synthesis
در حالت عادی یک صدای تک تون توسط یک موجع سینوسی با فرکانس تولید میشود. اما میتوان فرکانس را به صورت سینوسی تغییر داد. در این حالت تابع سینوسی به صورت زیر تعریف میشود:
که به فرکانس حامل (Carrier) و به فرکانس مدولاسیون (Modulation) گفته میشود و به اینکار مدولاسیون فرکانس (Frequency Modulation) گفته میشود.
برای مثال با استفاده از کد متلب دو سیگنال صوتی مدوله نشده و مدوله شده تولید شده است. سیگنال اول یک سینوسی با فرکانس یک کیلوهرتز است و سیگنال دوم یک سینوسی با فرکانس یک کیلوهرتز است که با یک سینوسی 10 هرتزی مدوله شده است و سیگنال سوم یک سینوسی با فرکانس یک کیلوهرتز است که با یک سینوسی 100 هرتزی مدوله شده است.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Fc = 1000; Fm = 10; Fs = 5000; N = 25000; Am = 1; t = 0:1/Fs:(N-1)/Fs; Sm = Am*sin(2*pi*Fm*t); Sc = sin(2*pi*(Fc+Sm).*t); figure; plot(t,Sc); ylim([-2 2]); sound(Sc,Fs); |
با تغییر این پارامترها میتوان صداهایی مثل باس، زنگ، پیانو الکتریکی و … ساخت. در هر کانال YM2612 میتوان 4 سیگنال سینوسی تولید کرد و میتوان این سیگنالها را با هم جمع کرد و یا به صورت تو در تو مدوله کرد.
در صوت زیر بخشی از موسیقی شروع بازی SONIC با استفاده از 5 کانال اول ساخته شده است.
SN76489
چیپ دوم SN76489 است. این چیپ قدیمیتر و سادهتر است و به آن معمولاPSG (Programmable Sound Generator) میگویند. مشخصات کلی SN76489 در جدول زیر آورده شده است.
|
مقدار |
ویژگی |
|
3 کانال |
کانال Tone |
|
1 کانال |
کانال Noise |
|
موج مربعی |
نوع موج |
|
16 سطح (4 بیت) |
کنترل ولوم |
|
Mono |
خروجی |
|
افکت، نویز، صداهای ساده |
کاربرد |
PSG چهار کانال دارد که سه کانال اول موج سینوسی تولید میکنند و کانال چهارم نویز تولید میکند. PSG معمولا برای تولید صدای پرش، شلیک، نویز انفجار و … استفاده میشود. مثلاً اگر YM2612 در حال پخش موسیقی باشد، PSG میتواند افکتهای کوچک را پخش کند تا کانالهای FM آزاد بمانند.
در صوت زیر بخشی از موسیقی شروع بازی SONIC با استفاده از 2 کانال اول و کانال 4 که برای تولید نویز است، ساخته شده است.
در نهایت مجموع دو صدای حاصل از YM2612 و PSG به صورت زیر پخش میشود.
تا اینجا نحوهی ساخت و نمایش تصویر توضیح داده شد. حالا نوبت به توضیح نحوهی دریافت فرمان از دستههای بازی میرسد.
کانکتور دسته ی بازی، شبیه به کانکتور DB-9 با 9 پین است؛ این در حالی است که دستهی بازی دارای 8 دکمه است و با پین تغذیه و زمین در مجموع به 10 پین نیاز دارد. برای حل این مشکل، به ازای هر یک از دکمههای Up، Down، Right و Left یک پین در نظر گرفته شده است و برای دکمههای A و B یک پین و برای دکمههای C و Start هم یک پین در نظر گرفته شده است. پس اگر دکمهی A یا B فشرده شود، پین مربوطه یک میشود و برای این که مشخص شود کدام دکمه فشرده شده است، یک پین با نام TH در نظر گرفته شده است که نشان میدهد کدام پین فشرده شده است، یعنی با 3 پین، 4 دکمه مدیریت میشود. به این کار اصطلاحا مالتی پلکسینگ (Multi Plexing) گفته میشود.
در ادامه اگر به طور مثال کلید بالا فشرده شود، پردازندهی 68000، اسپرایت متناظر با Sonic که در حال پریدن به سمت بالا است را جایگزین کاراکتر فعلی Sonic میکند و به همین ترتیب عملیات متناظر با کلیدهای دیگر اجرا میشود.

دستهی بازی سگا
در مجموع، معماری Sega Mega Drive نمونهای هوشمندانه از طراحی سختافزاری بهینه در محدودیتهای فنی و اقتصادی دههی ۸۰ میلادی است. استفاده از پردازندهی اصلی 68000، پردازندهی کمکی Z80، چیپ گرافیکی VDP و سیستم صوتی ترکیبی YM2612 و PSG باعث شد این کنسول توانایی بالایی در اجرای بازیهای سریع، رنگارنگ و پرصدا داشته باشد. همچنین طراحیهایی مانند مالتیپلکسینگ در دسته و مدیریت مستقل صدا و تصویر نشان میدهد که سگا با کمترین منابع، بیشترین کارایی را به دست آورده بود. به همین دلیل Mega Drive نهتنها از نظر فنی کنسولی تأثیرگذار بود، بلکه نقش مهمی در شکلگیری هویت بازیهای ۱۶ بیتی ایفا کرد.
وبسایت: http://afaelectronics.ir
واقعا لذت بردم. چقدر ایده های جالبی در گذشته برای دور زدن محدودیت های فنی به کار برده میشده.
از تهیه این مقاله شگفت انگیز، سپاس گزارم
از لطف شما متشکرم
امیدوارم لذت برده باشید
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.