لینک کوتاه مطلب : https://hsgar.com/?p=4598

کاناپه تا 64k – با نام مستعار ساختن یک کامپیوتر Breadboard Z80. قسمت 1: پین ها – Bread80.com

افراد زیادی می سازند Z80 کامپیوترهای مبتنی بر با بعضی ها چیزی می سازند LED های چشمک زن، برخی از دکمه ها، و شاید حتی یک درگاه سریال. اما کامپیوترهایی که از بچگی دوست داشتم، داشتم نمایشگرهای با وضوح بالا، و صفحه کلید، و جوی استیک ها پیوست شده است. و می توانید روزهای خود را با بازی بگذرانید بازی ها بر روی آنها

بنابراین، من قصد دارم یک کامپیوتر مبتنی بر Z80 بسازم تخته های نان، با برخی از سرگرم کننده عامل دخیل و همزمان با توسعه سخت افزار و نرم افزار آشنا شوید.

اکنون، اعتراف می‌کنم که در حال حاضر برنامه‌ای کاملاً مشخص برای اینکه چگونه این کار را انجام خواهم داد، یا اینکه کامپیوتر نهایی چگونه خواهد بود یا قادر به انجام آن خواهد بود، ندارم. اما من قصد دارم در این روند کمی لذت ببرم.

شما بیش از حد خوش آمدید به دنبال.

شروع شدن

پس از اینکه به شما قول سرگرمی و هیجان داده ام، اکنون شما را با چیزی واقعا خسته کننده شروع می کنم. بله، می دانم، اما قبل از اینکه بتوانیم به چیزهای خوب برسیم، باید اصول اولیه را درک کنیم.

برای این مرحله به شما نیاز دارید (به انتهای مقاله برای مشاوره خرید و برخی پیوندهای وابسته برای خوانندگانی که می توانند تحمل چند پنی به دست آوردن من را تحمل کنند، مراجعه کنید):

  • یک پردازنده Z80 شرط می بندم انتظارش را نداشتی
  • دو تخته نان.
  • یک آردوینو آردوینو نانو ایده‌آل است زیرا می‌توانید آن را به تخته نان بفرستید، اما هر کدام کار خواهد کرد.
  • مقداری سیم نان بردینگ
  • نوعی منبع تغذیه 5 ولت.
  • هشت مقاومت 1k یا مشابه.
  • یک مشت مقاومت 470 اهم یا مشابه.
  • یک مشت LED (یا یک بارکد LED اگر دارید).
  • چند سیم به سبک دوپون.
  • نمودار پین اوت Z80. در اینجا یک مورد مفید برای شما وجود دارد:
پخارج از Z-80، از کتاب داده های زیلوگ.

اتصالات اساسی

  • Z80 خود را داخل تخته نان بچسبانید.
  • آردوینو خود را در یک برد دیگر قرار دهید.
  • پین های 5 ولتی و زمینی Z80 و آردوینو را سیم کشی کنید. و در حالی که آنجا هستید، برق و ریل های زمینی روی تخته های نان را به هم بپیوندید. اگر یکی از آن بردهای بد با شکاف در ریل های برق را دارید، اکنون زمان خوبی برای سیم کشی آن ها نیز خواهد بود.
  • در Z80 سیگنال های INT، NMI، BUSRQ و WAIT را به منبع تغذیه 5 ولت متصل کنید. اینها سیگنال های ورودی هستند که باعث می شوند Z80 کارهای جالبی انجام دهد. آنها همچنین اگر به 5 ولت وصل نباشند، این نسخه نمایشی را خراب می کنند.
  • مقاومت ها را بین هر یک از پایه های D0 تا D7 و ریل زمین قرار دهید. مقاومت ها باید حدود 1k باشند اما مقدار دقیق آن مهم نیست. از هر چیزی که داری استفاده کن (مقاومت های آبی رنگ در عکس ها).
  • یک سیم بلندتر یا دوپونت را به پین ​​RESET وصل کنید. این برای تنظیم مجدد Z80 برای شروع به کار مورد نیاز است. اگر عقل دارید آن را از طریق یک کلید فشار لحظه ای با یک مقاومت کششی تا 5 ولت وصل کنید. من آن را به ریل 5 ولت وصل می کنم.
  • چند مقاومت و LED را به خطوط A0 و رو به بالا وصل کنید. من توصیه می‌کنم حداقل 8 خط را در اینجا وصل کنید تا بتوانیم ایده خوبی از آنچه اتفاق می‌افتد داشته باشیم. مقاومت ها باید بین 220 اهم تا 1 کیلو اهم باشند. مقادیر دقیق مهم نیستند. ولی من سمت کاتدی LED ها را به یک خط تخته نان وصل می کنم و سپس آن خط را به زمین وصل می کنم، نه اینکه مستقیماً آنها را به زمین سیم کشی کنم. وجود دارد بسیار دلیل خوبی برای این امر که به زودی آشکار خواهد شد.
  • پین Clock Z80 (پایه 6 که نماد عجیبی روی آن است) به پین ​​D13 در آردوینو وصل کنید. این نیز پینی است که LED آردوینو را چشمک می زند تا بتوانید هر چیزی را ببینید باید اتفاق می افتد.

اگر همه چیز طبق برنامه پیش رفته است، باید چیزی داشته باشید که به طور مبهم شبیه این عکس است:

عکس Z80 همانطور که توضیح داده شد سیم کشی شده است
Z80، سیم کشی شده و آماده عمل است.

و اگر لازم است، در اینجا یک شماتیک وجود دارد:

شماتیک برای برد برد Z80
شماتیک برای برد برد Z80 ما.

گرفتن طرح

اکنون آماده نوشتن یک طرح آردوینو برای تولید سیگنال ساعت هستیم. پین را روی خروجی تنظیم می کنیم و سپس آن را روشن و خاموش می کنیم. با مقدار انتظار حدود 10 میلی ثانیه شروع کنید. البته اگر نیاز دارید که زندگی خود را آسان‌تر کنید، می‌توانید این را تنظیم کنید.

#include "Arduino.h"

#define LED 13

void setup() {
  Serial.begin(115200);

  pinMode(LED,OUTPUT);
}

int wait = 10;

void loop() {
  digitalWrite(LED,HIGH);
  delay(wait);
  digitalWrite(LED,LOW);
  delay(wait);
}

برق را روشن کنید. سیم RESET را برای لحظه ای به زمین وصل کنید (یا دکمه تنظیم مجدد خود را فشار دهید).

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

اینجا چه اتفاقی دارد میافتد؟ Z80 در حال خواندن دستورالعمل ها و داده ها از خطوط D0 تا D7 است. آن دارد یک شمارنده برنامه که آدرسی را که دستورالعمل ها از آن می آیند ثبت می کند. این آدرس را در گذرگاه آدرس (خطوط A0 تا A15) خروجی می دهد و داده های آن آدرس را می خواند. این داده است opcode یا دستوری که باید اجرا شود. از آنجایی که ما تمام پین های داده را به زمین وصل کرده ایم (از طریق مقاومت ها)، Z80 ​​صفرها را می خواند. Opcode $00 دستورالعمل NOP است. NOP مخفف No OPeration است و به معنای واقعی کلمه، هیچ کاری نکنید.

بنابراین، پردازنده در opcode می خواند و کاری انجام نمی دهد. خوب، از نظر فنی، حتی برای یک اپکد NOP هم چند کار انجام می دهد، اما هیچ کار مفیدی انجام نمی دهد که در اینجا ارزش توصیف را داشته باشد. سپس Z80 یکی را به آن اضافه می کند شمارنده برنامه و این فرآیند را برای اپکد بعدی تکرار می کند.

آن کار می کند! … بیایید آن را بشکنیم!

خوب اکنون سیستم را خاموش کنید و مقاومت های روی پین های داده را تغییر دهید تا به جای ریل زمین به ریل 5 ولت متصل شوند. روشن کنید و دوباره ریست کنید. حالا چه اتفاقی می افتد؟

باید ببینید که به نظر می رسد همه چیز اشتباه رفته است. آن آدرس‌هایی که به خوبی شمارش می‌کنند اکنون مخدوش شده‌اند. این همان نقطه ای است که اکثر مردم به یک فروم اینترنتی می روند تا بپرسند آیا Z80 آنها خراب است یا خیر. نه، اینطور نیست.

به خاطر دارید که همه LED های خود را از طریق یک سیم به زمین متصل کردیم؟ یادت هست گفتم دلیل این کار بعدا مشخص می شود؟ خوب، آن زمان اکنون است.

آن اتصال را از زمین جدا کرده و به پین ​​REFRESH (یا RFSH) Z80 وصل کنید. اگر زمانی که رایانه شما روشن بود، با انجام این کار چیزی کوتاه نکردید، باید ببینید که شمارش دوباره به درستی کار می کند. … اما اگر آن را به اندازه کافی طولانی بگذارید، متوجه می شوید که فقط هفت بیت اول آدرس را می شمارد.

همچنین متوجه خواهید شد که LED ها در حال سوسو زدن هستند، گاهی آدرس را نشان می دهند و گاهی چیزی را نشان نمی دهند. خط REFRESH است فعال کم. این بدان معناست که به طور پیش فرض خروجی 5 ولت است، اما زمانی که سیگنال فعال است، خروجی صفر ولت دارد. با اتصال کاتد LED های خود به آن، تنها زمانی که سیگنال فعال است خروجی را روی LED ها مشاهده می کنیم.

فحشا با پین

اکنون سیم زمین LED را به نوبت به هر یک از خروجی های دیگر متصل کنید: M1، WR، RD، IORQ و MREQ. چه اتفاقی می افتد؟

احتمالاً خواهید دید که برخی از آنها هرگز چیزی را نشان نمی دهند و برخی دیگر نشان می دهند، اما پین های مختلف چیزهای متفاوتی را نشان می دهند.

با وارد کردن $FF به خطوط داده، ما در یک کد عملیاتی تغذیه می کنیم که اجرا را به آدرس حافظه هگز $38 منتقل می کند. فعلاً نگران نباشید که آن opcode دقیقاً چه کاری انجام می دهد یا چرا ممکن است مفید باشد. اجازه دهید برخی از پین‌ها و آنچه را که در واقع نشان می‌دهند بررسی کنیم:

M1: برای کد اپکد 38 دلاری، خطوط آدرس همیشه باید 00111000 باینری را نشان دهند وقتی M1 فعال است. این به این دلیل است که هر زمان که Z80 در حال خواندن یک کد عملیاتی باشد، M1 فعال است. باینری 00111000 نیز 38 دلار هگز است. از پاراگراف بالا به خاطر داشته باشید که اپکد $FF به آدرس حافظه $38 می رود. بنابراین پردازنده به طور مداوم به آدرس 38 دلار باز می گردد و بنابراین ما همیشه آن آدرس را برای حالت M1 می بینیم.

RD هست خواندن علامت. زمانی که Z80 در حال خواندن داده‌ها باشد فعال است، در این مورد تنها خواندنی که Z80 انجام می‌دهد مربوط به opcode است. سایر کدهای عملیاتی ممکن است بایت های بیشتری را به عنوان بخشی از دستورالعمل یا داده (یا هر دو) بخوانند.

WR هست نوشتن علامت. زمانی که Z80 در حال نوشتن داده باشد فعال است. دستورالعمل NOP هیچ داده ای را نمی نویسد بنابراین هرگز این سیگنال را فعال نمی کند. کد عملیاتی $FF مقداری داده را می نویسد. اگر LED ها را در حین اجرا تماشا کنید، باید شاهد کاهش اعداد باینری باشید. آنچه را که واقعاً در اینجا اتفاق می‌افتد را می‌گذارم تا در زمان خود بررسی کنید.

MREQ هست درخواست حافظه سیگنال می دهد و هر زمان که Z80 دسترسی داشته باشد فعال است حافظه، یا خواندن یا نوشتن.

IORQ در واقع هیچ چیز مفیدی را در حال حاضر به شما نشان نمی دهد. این است درخواست I/O علامت. این شبیه به سیگنال MREQ است اما زمانی فعال است که پردازنده به دستگاه های ورودی یا خروجی دسترسی دارد.

بیایید خاطرات خود را تازه کنیم

همه اینها ما را به سیگنال RFSH برمی گرداند.

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

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

و با این تکه اطلاعات، اکنون بیشتر از 95 درصد افرادی که چیزی در مورد Z80 نمی‌دانند، درباره Z80 می‌دانید. آفرین.

Opcode Playtime

به هر حال، اجازه دهید به بازی با کدهای عملیاتی برگردیم. (و ببینید، ما بالاخره توانستیم بازی کنیم!) به یک نگاهی بیندازید جدول کدهای عملیاتی Z80 و سعی کنید با اتصال مقاومت پین داده خود به 5 ولت یا زمین در صورت لزوم، آنها را به خطوط داده وصل کنید و ببینید چه اتفاقی می افتد.

(و در اینجا توجه داشته باشید که خطوط داده در واقع به جای یک خط درهم و برهم هستند – مراقب باشید).

من می توانم به ویژه کد عملیاتی JP nn را در هگز $C3 توصیه کنم. این یک اپکد سه بایتی است. بایت $C3 اولیه توسط یک آدرس دو بایتی 16 بیتی برای پرش دنبال می شود. اما از آنجایی که ما $C3 را به عنوان هر بایت ورودی ارسال می کنیم، همیشه به آدرس $00C3 می رود. شما متوجه خواهید شد که شمارنده برنامه (پین RD) از C3 تا C4 دلار و C5 دلار در هنگام خواندن آن سه بایت به شمار می رود. پین M1 همیشه C3 دلار را نشان می‌دهد، اما آن را کمتر نشان می‌دهد. (بایت اول Opcode است، دو بایت دیگر داده های Opcode هستند، بنابراین خواندن آنها سیگنال M1 را تولید نمی کند.)

Opcode $0A یک بایت را از حافظه می خواند، بنابراین آدرسی را که می خواند از خروجی مشاهده خواهید کرد. Opcode $02 برعکس عمل می کند و یک بایت را در یک آدرس حافظه می نویسد، بنابراین مقداری از نوشتن حافظه را مشاهده خواهید کرد.

بسیاری از اپکدها تنها یک بایت هستند و عملیات داخلی را انجام می دهند، بنابراین هیچ اتفاقی بیش از یک NOP نخواهید دید. اما برخی از آنها زمان بیشتری برای انجام این کار نیاز دارند، بنابراین شما مکث طولانی تری بین خواندن و حالت های M1 خواهید دید. یک مثال خوب از این کد 09 دلاری است.

و اگر می‌خواهید چیزی برای تأمل در نظر بگیرید، اپکد هگز 18 دلاری را امتحان کنید و ببینید آیا می‌توانید بفهمید که چه اتفاقی برای شمارنده برنامه می‌افتد یا خیر.

تا دفعه بعد خوش بگذره

خرید لینک و مشاوره

لازم نیست من توضیح دهم که پیوند وابسته چیست. آنها در اینجا با (Aff) مشخص شده اند.

پانویسها و منابع

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.