داستان Z80: پردازنده‌ای ۸ بیتی با روح ۱۶ بیتی

داستان Z80: پردازنده‌ای ۸ بیتی با روح ۱۶ بیتی

Z80؛ پردازنده‌ای ۸ بیتی که با رجیسترهای جفتی و آدرس‌دهی هوشمند، روح ۱۶ بیتی داشت.

  • داستان Z80

  • زیگورات Z80: داستان پردازنده‌ای که دهه‌ی هفتاد را ۸ بیتی اما با ذهنیت ۱۶ بیتی ساخت

دهه‌ی ۱۹۷۰ میلادی، دوران شکل‌گیری صنعت میکروپروسسور بود؛ زمانی که شرکت‌های نوپا با منابع محدود، تراشه‌هایی می‌ساختند که بعدها زیرساخت انقلاب کامپیوترهای خانگی شدند. در میان تمام این تراشه‌ها، Zilog Z80 جایگاهی ویژه دارد؛ نه‌فقط به‌خاطر موفقیت تجاری‌اش، بلکه به‌خاطر ترفندهای مهندسی‌ای که به یک پردازنده‌ی ۸ بیتی اجازه می‌داد کارهایی در سطح پردازنده‌های ۱۶ بیتی انجام دهد.

  • تولد Z80 و میراث Intel 8080

داستان Z80 از دل نارضایتی چند مهندس اینتل آغاز شد. فدریکو فاجین (Federico Faggin)، یکی از طراحان اصلی پردازنده‌ی 8080، پس از جدایی از اینتل، شرکت Zilog را در سال ۱۹۷۴ تأسیس کرد. هدف تیم او ساخت پردازنده‌ای بود که با کد ماشین 8080 سازگار باشد اما از نظر مجموعه دستورات و سرعت، برتری قابل‌توجهی داشته باشد.

نتیجه، Z80 بود؛ تراشه‌ای که در سال ۱۹۷۶ عرضه شد و به‌سرعت به یکی از پرکاربردترین پردازنده‌های تاریخ تبدیل شد. Z80 نه‌تنها با نرم‌افزارهای نوشته‌شده برای 8080 سازگار بود، بلکه دستورات جدید، رجیسترهای اضافی و قابلیت‌های سخت‌افزاری بیشتری هم داشت.

  • معماری ۸ بیتی با آدرس‌دهی ۱۶ بیتی

نکته‌ی کلیدی درباره‌ی Z80 و بسیاری از پردازنده‌های هم‌عصرش این است که وقتی می‌گوییم «پردازنده‌ی ۸ بیتی»، منظور عرض گذرگاه داده (Data Bus) است، نه لزوماً تمام جنبه‌های پردازنده. Z80 دقیقاً در همین نقطه یک ترفند مهم پیاده‌سازی کرده بود: اگرچه داده در واحدهای ۸ بیتی جابه‌جا می‌شد، اما گذرگاه آدرس (Address Bus) آن ۱۶ بیتی بود.

این یعنی Z80 می‌توانست تا ۶۵٬۵۳۶ آدرس حافظه (۶۴ کیلوبایت) را مستقیماً آدرس‌دهی کند، چیزی که برای دهه‌ی ۱۹۷۰ رقم بسیار بزرگی بود. این طراحی، مرز میان پردازنده‌های ۸ بیتی و ۱۶ بیتی را تا حدی محو کرد؛ چون از نظر ظرفیت آدرس‌دهی، Z80 عملاً در سطح تراشه‌های ۱۶ بیتی رقابت می‌کرد.

  • رجیسترهای جفتی: ترفند اصلی محاسبات ۱۶ بیتی

مهم‌ترین روشی که Z80 برای شبیه‌سازی رفتار ۱۶ بیتی استفاده می‌کرد، مفهوم رجیسترهای جفتی (Register Pairs) بود. Z80 شش رجیستر ۸ بیتی اصلی داشت: B، C، D، E، H و L. برنامه‌نویس می‌توانست این رجیسترها را دو به دو ترکیب کند و به‌عنوان یک رجیستر ۱۶ بیتی واحد استفاده کند: BC، DE و HL.

برای مثال، دستور LD HL, 1234h یک مقدار ۱۶ بیتی را مستقیماً در رجیستر ترکیبی HL بارگذاری می‌کرد. این رجیسترهای جفتی معمولاً برای نگه‌داشتن آدرس حافظه (Pointer) به کار می‌رفتند؛ مثلاً HL اغلب به‌عنوان اشاره‌گر اصلی برای دسترسی به حافظه استفاده می‌شد.

علاوه بر این، Z80 دستورات محاسباتی مخصوص ۱۶ بیتی هم داشت، از جمله:

  • ADD HL, rr: جمع دو مقدار ۱۶ بیتی بدون نیاز به شکستن آن‌ها به بایت‌های جداگانه
  • ADC HL, rr و SBC HL, rr: جمع و تفریق ۱۶ بیتی با در نظر گرفتن بیت carry
  • INC و DEC روی رجیسترهای جفتی، برای افزایش یا کاهش سریع مقادیر ۱۶ بیتی

این دستورات باعث می‌شد بسیاری از محاسبات آدرس‌دهی و شمارش حلقه، بدون نیاز به نوشتن روال‌های دستی چندبایتی، مستقیماً در سطح سخت‌افزار انجام شوند.

  • پشته و اشاره‌گر برنامه: دو ستون ۱۶ بیتی

دو رجیستر حیاتی دیگر در Z80، یعنی اشاره‌گر پشته (Stack Pointer یا SP) و شمارنده‌ی برنامه (Program Counter یا PC)، از ابتدا کاملاً ۱۶ بیتی طراحی شده بودند. این انتخاب طراحی، اهمیت زیادی داشت؛ چون تمام آدرس‌های بازگشت از توابع، آدرس‌های پرش و داده‌های ذخیره‌شده در پشته، به‌طور طبیعی در قالب ۱۶ بیتی مدیریت می‌شدند، بدون این‌که برنامه‌نویس مجبور باشد آن‌ها را به دو بخش ۸ بیتی تقسیم کند.

  • روش‌های نرم‌افزاری برای عبور از محدودیت ۸ بیت

وقتی محاسباتی فراتر از ظرفیت دستورات سخت‌افزاری ۱۶ بیتی مورد نیاز بود (مثلاً اعداد ۳۲ بیتی)، برنامه‌نویسان دهه‌ی هفتاد و هشتاد به روش‌های چندبایتی (Multi-byte Arithmetic) روی می‌آوردند. در این روش، اعداد بزرگ به چند بایت تقسیم می‌شدند و عملیات جمع یا تفریق با استفاده از بیت carry، بایت به بایت و در یک حلقه انجام می‌شد؛ دقیقاً همان کاری که امروز در سطح نرم‌افزار برای اعداد Big Integer انجام می‌دهیم.

  • بانک‌بندی حافظه: راه‌حلی برای عبور از سقف ۶۴ کیلوبایت

یکی دیگر از ترفندهای رایج در پردازنده‌های این دوره، به‌ویژه در کامپیوترهای خانگی مبتنی بر Z80 مثل ZX Spectrum و MSX، تکنیک بانک‌بندی حافظه (Memory Bank Switching) بود. از آن‌جا که گذرگاه آدرس ۱۶ بیتی سقفی معادل ۶۴ کیلوبایت ایجاد می‌کرد، طراحان سخت‌افزار با افزودن مدارهای جانبی، امکان جابه‌جایی بین چند بانک حافظه‌ی فیزیکی را فراهم می‌کردند؛ به این ترتیب سیستم می‌توانست به حافظه‌ای بسیار بزرگ‌تر از محدودیت ذاتی پردازنده دسترسی داشته باشد، هرچند در هر لحظه فقط یک بانک ۶۴ کیلوبایتی «دیده» می‌شد.

  • رجیسترهای اندیس IX و IY: یک لایه‌ی ۱۶ بیتی دیگر

فراتر از BC، DE و HL، طراحان Z80 دو رجیستر اضافی و کاملاً ۱۶ بیتی به نام‌های IX و IY اضافه کردند که در نسخه‌ی اصلی 8080 وجود نداشتند. این رجیسترهای اندیس (Index Registers) عمدتاً برای آدرس‌دهی نسبی (Indexed Addressing) استفاده می‌شدند؛ یعنی برنامه‌نویس می‌توانست یک آدرس پایه را در IX یا IY قرار دهد و سپس با یک افست کوچک (Displacement)، به عناصر مختلف یک آرایه یا ساختار داده دسترسی پیدا کند، بدون نیاز به محاسبه‌ی مجدد آدرس در هر مرحله. این ویژگی به‌خصوص برای پیاده‌سازی ساختارهای داده‌ی پیچیده‌تر، شبیه آن‌چه در زبان‌های سطح بالاتر می‌بینیم، در سطح اسمبلی بسیار کاربردی بود.

  • دستورات پنهان: میراث غیررسمی Z80

یکی از جنبه‌های جالب Z80 که آن را در میان برنامه‌نویسان اسمبلی محبوب کرد، وجود دستورات مستندنشده (Undocumented Instructions) بود. مهندسان Zilog برخی ترکیب‌های کد عملیاتی را عمداً یا سهواً بدون مستندسازی رسمی در تراشه باقی گذاشته بودند. برنامه‌نویسان باتجربه با آزمایش و خطا این دستورات را کشف کردند و از آن‌ها برای دسترسی به بایت‌های بالا و پایین رجیسترهای IX و IY (به نام‌های غیررسمی IXH، IXL، IYH و IYL) به‌عنوان رجیسترهای ۸ بیتی مستقل استفاده می‌کردند؛ ترفندی که فضای رجیستری در دسترس برنامه را عملاً افزایش می‌داد و در بازی‌های آرکید و نرم‌افزارهای بهینه‌شده برای سرعت، به‌کرات به کار می‌رفت.

  • همسایه‌های Z80: رقابت پردازنده‌های دهه‌ی هفتاد

Z80 در خلأ به وجود نیامد؛ دهه‌ی هفتاد میدان رقابت شدید چند معمار تراشه بود:

  • Intel 8080: اجداد مستقیم Z80 و پایه‌ی سیستم‌عامل CP/M
  • MOS Technology 6502: پردازنده‌ای ارزان و ساده که در Apple II و Commodore 64 استفاده شد و از سبک آدرس‌دهی صفحه‌ای (Zero Page) برای دسترسی سریع‌تر به حافظه بهره می‌برد
  • Motorola 6800: رقیب مستقیم 8080 با فلسفه‌ی طراحی متفاوت در مدیریت رجیسترها

هرکدام از این تراشه‌ها رویکرد خاص خود را برای عبور از محدودیت‌های ۸ بیتی داشتند، اما ترکیب رجیسترهای جفتی و آدرس‌دهی ۱۶ بیتی Z80 آن را به یکی از منعطف‌ترین گزینه‌ها برای برنامه‌نویسی سطح پایین تبدیل کرد.

  • میراث ماندگار

Z80 نه‌تنها در کامپیوترهای خانگی مثل ZX Spectrum، Amstrad CPC و MSX به کار رفت، بلکه در ماشین‌های آرکید، ماشین‌حساب‌های پیشرفته و حتی برخی سیستم‌های صنعتی دهه‌ها مورد استفاده باقی ماند. نسخه‌های مدرن و تعبیه‌شده‌ی آن (eZ80) هنوز هم در برخی تجهیزات صنعتی و آموزشی تولید و استفاده می‌شوند.

  • جمع‌بندی

Z80 نمونه‌ی درخشانی از هوشمندی مهندسی در شرایط محدودیت سخت‌افزاری دهه‌ی هفتاد است. با ترکیب گذرگاه داده‌ی ۸ بیتی و گذرگاه آدرس ۱۶ بیتی، رجیسترهای جفتی‌شونده، دستورات محاسباتی اختصاصی ۱۶ بیتی و تکنیک‌های نرم‌افزاری مثل محاسبات چندبایتی و بانک‌بندی حافظه، این پردازنده توانست فراتر از طبقه‌بندی ساده‌ی «۸ بیتی» عمل کند. همین انعطاف‌پذیری بود که Z80 را به یکی از تأثیرگذارترین تراشه‌های تاریخ کامپیوتر تبدیل کرد؛ میراثی که تا امروز در طراحی معماری‌های پردازنده قابل ردیابی است.