آشنایی با دستورات اوپکد 6502
::: در حال بارگيري لطفا صبر کنيد :::
صفحه اصلي انجمن ورود عضويت خوراک نقشه تماس با ما
نام کاربري : پسورد : يا عضويت | رمز عبور را فراموش کردم

صفحه اصلي ? برنامه نویسی ? آشنایی با دستورات اوپکد 6502

تعداد بازديد : 232
نويسنده پيام
farid آفلاين



ارسال‌ها : 139
عضويت : 25 /2 /1393
محل زندگي : ارومیه
سن : 29
ياهو : krauser35@yahoo.com
تشکر ها: 90
تشکر شده : 148
آشنایی با دستورات اوپکد 6502
لینک مقاله اصلی : Opcodes 6502

1. انواع وقفه‌ها
وقتی که وقفه ایجاد میشه پردازنده وظیفه‌ای رو که در حال انجامش هست رو به طور موقت متوقف میکنه و کار جدیدی رو که در اثر وقفه بهش محول میشه رو انجام میده. به طور کلی سه نوع وقفه وجود داره :

1.1. وقفه NMI
این وقفه توسط پردازنده گرافیک ایجاد میشه و به پردازنده اصلی اطلاع میده که نمایش یه فریم رو تکمیل کرده و منتظر پاک شدن صفحه هست تا فریم بعدی رو نمایش بده. مدت زمانی که در اون صفحه نمایش پاک میشه پاک سازی عمومی (vBlank) گفته میشه. این زمان اهمیت زیادی داره چون فقط در طی این زمان میشه فریم جدید رو با گرافیک متفاوت نمایش داد.

1.2. وقفه Reset
وقتی کنسول روشن میشه یا دکمه ریست زده میشه این وقفه فعال میشه و پردازنده رو به آدرس آغازین دستورات ارجاع میده.

1.3. وقفه IRQ یا BRK
وقفه IRQ توسط سخت افزاری که داخل بعضی از کارتریج‌ها قرار داره ایجاد میشه. معمولا این نوع کارتریج‌ها برای بازی‌های پیچیده و پرججم استفاده میشه. وقفه BRK هم زمانی اجرا میشه که پردازنده دستور اوپ کد BRK رو اجرا بکنه.


2. انواع ثبات‌ها

2.1. ثبات A
اکثر محاسبات ریاضی و منطقی بر روی مقدار این ثبات انجام میشه.

2.2. ثبات‌های X و Y
ثبات‌های کمکی هستن که بیشتر برای شمارش حلقه به کار میرن.

2.3. ثبات پشته
یه نوع اشاره‌گر هست که حافظه خالی بعدی در قسمتی از رم ($01XX) رو مشخص میکنه که XX همون مقدار این ثبات هست.

2.4. ثبات شمارشگر
این ثبات که 16 بیتی هست، آدرس آفستی که پردازنده در حال اجراش هست رو دقیقا مشخص میکنه.

2.5. ثبات پردازنده
این ثبات اطلاعات مربوط به وضعیت پردازنده رو نگهداری میکنه. اجرای دستورات مختلف باعث تغییر در مقدار این ثبات میشن. این ثبات 8 بیتی هست. هر بیت این ثبات نشان دهنده وضعیت خاصی از پردازنده هست.


3. تشریح بیت‌های ثبات پردازنده

3.1. بیت انتقال
به این بیت انتقال هم میگن و اگه حاصل عملیاتی توی یه مقدار هشت بیتی جا نشه این بیت فعال (1) میشه. مثلا اگه مقدار ثبات A بیشتر از 255 یا کمتر از 0 بشه این بیت فعال میشه.

3.2. بیت صفر
به این بیت وضعیت صفر هم میگن. و در حالتی فعال میشه که حاصل عملیات اخیر صفر بشه.

3.3. بیت وقفه
این بیت وضعیت وققه IRQ رو مشخص میکنه. اگه این بیت فعال باشه از اجرای وقفه IRQ جلوگیری میکنه. اگه این بیت غیرفعال باشه وفقه IRQ مجاز خواهد بود.

3.4. بیت دهدهی
به این بیت وضعیت دهدهی هم میگن. با فعال شدن این بیت پردازنده اعداد رو دهدهی در نظر میگیره. و با غیر فعال شدن این بیت پردازنده اعداد رو هگزادسیمال (مبنای 16) در نظر میگیره. البته این بیت بر روی پردازنده اورجینال شرکت نینتندو تاثیری نداره چون به لحاظ سخت افزاری کاملا غیرفعال هست.

3.5. بیت توقف
با اجرا شدن دستور BRK این بیت فعال میشه.

3.6. بیت تغییر علامت
اگه علامت عدد تغییر پیدا بکنه این بیت فعال میشه.

3.7. بیت علامت
این بیت نشان دهنده مثبت یا منفی بودن عدد حاصل از آخرین دستورالعمل هست. مثبت یا منفی بودن یه عدد بر اساس بیت 7 ام اون عدد مشخص میشه. بنابراین عدد FF که در مبنای دودویی میشه 11111111 یه عدد منفی هست و باعث میشه که بیت 7 ام ثبات پردازنده هم فعال بشه.


4. حالت‌های مختلف تعیین عملوند
اکثر دستورات اسمبلی نیاز به عملوند دارن. به طور کل 7 روش برای تعیین عملوند وجود داره. که عبارت‌اند از :

4.1. مقدار مستقیم
مانند LDA #$3F که مقدار 3F به طور مستقیم در داخل ثبات A ذخیره میشه.

4.2. آدرس مستقیم
مانند STA $2007 که در این حالت مقدار A به طور مستقیم در آدرس 2007 ذخیره میشه.

4.3. آدرس شاخص دار
مانند STA $8000,X و اگه X=#$20 باشه در اون صورت مقدار A در آدرس 8020 ذخیره میشه.

4.4. آدرس غیر مستقیم
مانند JMP ($FFFC) و اگه مقادیر موجود در آدرس‌های FFFD و FFFC به ترتیب برابر 80 و 00 باشن، در نهایت عمل پرش به آدرس 8000 خواهد بود.
نکته : پردازنده میکرو از نوع کوچیک ته خور هست و بنابراین مقادیر موجود در دو تا آدرس بالا به طور معکوس کنار هم قرار داده میشن.

4.5. آدرس غیر مستقیم شاخص دار
مانند LDA ($00),Y و اگه مقادیر موجود در آدرس‌های 0001 و 0000 به ترتیب برابر 80 و 00 باشن، و مقدار Y هم برابر 05 باشه، در نهایت مقدار A از آدرس 8005 لود میشه.
نکته : این دستور فقط برای آدرس‌های $00XX قابل انجام هست.

4.6. ثبات به ثبات
در این حالت هیچ نوع آدرس دهی انجام نمیشه و عمل بین ثبات‌ها انجام میشه. مانند TXA که باعث میشه مقدار موجود در ثبات X به داخل ثبات A کپی بشه.

4.7. ضمنی
در این حالت هیچ نوع عملوندی استفاده نمیشه. مانند دستور NOP که پردازنده هیچ کاری انجام نمیده و یا دستور BRK که باعث ایجاد وقفه IRQ میشه.


5. دستورات اوپ کد 6502
در کل 56 تا دستور اوپ کد 6502 وجود داره که در ادامه کارکرد هر کدوم رو به طور مختصر و مفید بیان میکنم.

5.1. دستورات لود و ذخیره

[table border="1"][tr][td align="center"]مقدار عملوند رو به A لود میکنه[/td]
[td align="center"]LDA[/td]
[/tr]
[tr][td align="center"]مقدار عملوند رو به X لود میکنه[/td]
[td align="center"]LDX[/td]
[/tr]
[tr][td align="center"]مقدار عملوند رو به Y لود میکنه[/td]
[td align="center"]LDY[/td]
[/tr]
[tr][td align="center"]مقدار A رو ذخیره میکنه[/td]
[td align="center"]STA[/td]
[/tr]
[tr][td align="center"]مقدار X رو ذخیره میکنه[/td]
[td align="center"]STX[/td]
[/tr]
[tr][td align="center"]مقدار Y رو ذخیره میکنه[/td]
[td align="center"]STY[/td]
[/tr]



5.2. دستورات افزایش و کاهش

[table border="1"][tr][td align="center"]یک واحد مقدار عملوند رو افزایش میده[/td]
[td align="center"]INC[/td]
[/tr]
[tr][td align="center"]یک واحد مقدار ثبات X رو افزایش میده[/td]
[td align="center"]INX[/td]
[/tr]
[tr][td align="center"]یک واحد مقدار ثبات Y رو افزایش میده[/td]
[td align="center"]INY[/td]
[/tr]
[tr][td align="center"]یک واحد مقدار عملوند رو کاهش میده[/td]
[td align="center"]DEC[/td]
[/tr]
[tr][td align="center"]یک واحد مقدار ثبات X رو کاهش میده[/td]
[td align="center"]DEX[/td]
[/tr]
[tr][td align="center"]یک واحد مقدار ثبات Y رو کاهش میده[/td]
[td align="center"]DEY[/td]
[/tr]



5.3. دستورات جمع و تفریق

[table border="1"][tr][td align="center"]مقدار مشخصی رو به عملوند اضافه میکنه[/td]
[td align="center"]ADC[/td]
[/tr]
[tr][td align="center"]مقدار مشخصی رو از عملوند کم میکنه[/td]
[td align="center"]SBC[/td]
[/tr]



5.4. دستورات ضرب و تقسیم

[table border="1"][tr][td align="center"]مقدار عملوند رو دو برابر میکنه[/td]
[td align="center"]ASL[/td]
[/tr]
[tr][td align="center"]مقدار عملوند رو نصف میکنه[/td]
[td align="center"]LSR[/td]
[/tr]
[tr][td align="center"]برای دو برابر کردن مقادیر بیشتر از 8 بینی به کار میره[/td]
[td align="center"]ROL[/td]
[/tr]
[tr][td align="center"]برای نصف کردن مقادیر بیشتر از 8 بیتی به کار میره[/td]
[td align="center"]ROR[/td]
[/tr]



5.5. دستورات ثبات به ثبات

[table border="1"][tr][td align="center"]مقدار ثبات A رو به ثبات X کپی میکنه[/td]
[td align="center"]TAX[/td]
[/tr]
[tr][td align="center"]مقدار ثبات X رو به ثبات A کپی میکنه[/td]
[td align="center"]TXA[/td]
[/tr]
[tr][td align="center"]مقدار ثبات A رو به ثبات Y کپی میکنه[/td]
[td align="center"]TAY[/td]
[/tr]
[tr][td align="center"]مقدار ثبات Y رو به ثبات A کپی میکنه[/td]
[td align="center"]TYA[/td]
[/tr]
[tr][td align="center"]مقدار ثبات X رو به ثبات پشته کپی میکنه[/td]
[td align="center"]TXS[/td]
[/tr]
[tr][td align="center"]مقدار ثبات پشته رو به ثبات X کپی میکنه[/td]
[td align="center"]TSX[/td]
[/tr]
[tr][td align="center"]مقدار ثبات A رو به ثبات پشته کپی میکنه[/td]
[td align="center"]PHA[/td]
[/tr]
[tr][td align="center"]مقدار ثبات پشته رو به ثبات A کپی میکنه[/td]
[td align="center"]PLA[/td]
[/tr]
[tr][td align="center"]مقدار ثبات پردازنده رو به ثبات پشته کپی میکنه[/td]
[td align="center"]PHP[/td]
[/tr]
[tr][td align="center"]مقدار ثبات پشته رو به ثبات پردازنده کپی میکنه[/td]
[td align="center"]PLP[/td]
[/tr]



5.6. دستورات پرش

[table border="1"][tr][td align="center"]به یه آدرس مشخص پرش میکنه[/td]
[td align="center"]JMP[/td]
[/tr]
[tr][td align="center"]به یه آدرس مشخص پرش میکنه و محل انجام پرش رو توی ثبات شمارشگر ذخیره میکنه[/td]
[td align="center"]JSR[/td]
[/tr]
[tr][td align="center"]به آدرسی که توی ثبات شمارشگر ذخیره شده پرش میکنه[/td]
[td align="center"]RTS[/td]
[/tr]
[tr][td align="center"]برای پایان دادن به وقفه‌های NMI یا IRQ استفاده میشه[/td]
[td align="center"]RTI[/td]
[/tr]



5.7. دستورات تغییر وضعیت بیت‌های ثبات پردازنده

[table border="1"][tr][td align="center"]بیت انتقال رو غیر فعال میکنه[/td]
[td align="center"]CLC[/td]
[/tr]
[tr][td align="center"]بیت انتقال رو فعال میکنه[/td]
[td align="center"]SEC[/td]
[/tr]
[tr][td align="center"]بیت وضعیت وقفه IRQ رو غیر فعال میکنه[/td]
[td align="center"]CLI[/td]
[/tr]
[tr][td align="center"]بیت وضعیت وقفه IRQ رو فعال میکنه[/td]
[td align="center"]SEI[/td]
[/tr]
[tr][td align="center"]بیت وضعیت دهدهی رو غیر فعال میکنه[/td]
[td align="center"]CLD[/td]
[/tr]
[tr][td align="center"]بیت وضعیت دهدهی رو فعال میکنه[/td]
[td align="center"]SED[/td]
[/tr]
[tr][td align="center"]بیت وضعیت علامت رو غیر فعال میکنه[/td]
[td align="center"]CLV[/td]
[/tr]



5.8. دستورات پرش شرطی

[table border="1"][tr][td align="center"]انجام پرش به آدرس مشخص در صورت غیر فعال بودن بیت انتقال[/td]
[td align="center"]BCC[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت فعال بودن بیت انتقال[/td]
[td align="center"]BCS[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت غیر فعال بودن بیت صفر[/td]
[td align="center"]BNE[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت فعال بودن بیت صفر[/td]
[td align="center"]BEQ[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت غیر فعال بودن بیت تغییر علامت[/td]
[td align="center"]BVC[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت فعال بودن بیت تغییر علامت[/td]
[td align="center"]BVS[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت غیر فعال بودن بیت علامت[/td]
[td align="center"]BPL[/td]
[/tr]
[tr][td align="center"]انجام پرش به آدرس مشخص در صورت فعال بودن بیت علامت[/td]
[td align="center"]BMI[/td]
[/tr]



5.9. دستورات مقایسه

[table border="1"][tr][td align="center"]مقدار ثبات A رو با مقدار عملوند مقایسه میکنه[/td]
[td align="center"]CMP[/td]
[/tr]
[tr][td align="center"]مقدار ثبات X رو با مقدار عملوند مقایسه میکنه[/td]
[td align="center"]CPX[/td]
[/tr]
[tr][td align="center"]مقدار ثبات Y رو با مقدار عملوند مقایسه میکنه[/td]
[td align="center"]CPY[/td]
[/tr]
[tr][td align="center"]بین بیت‌های ثبات A و بیت‌های عملوند مقایسه منطقی AND انجام میده و نتیجه رو در ثبات A ذخیره میکنه[/td]
[td align="center"]AND[/td]
[/tr]
[tr][td align="center"]بین بیت‌های ثبات A و بیت‌های عملوند مقایسه منطقی OR انجام میده و نتیجه رو در ثبات A ذخیره میکنه[/td]
[td align="center"]ORA[/td]
[/tr]
[tr][td align="center"]بین بیت‌های ثبات A و بیت‌های عملوند مقایسه منطقی EOR انجام میده و نتیجه رو در ثبات A ذخیره میکنه[/td]
[td align="center"]EOR[/td]
[/tr]
[tr][td align="center"]برای وقفه NMI استفاده میشه[/td]
[td align="center"]BIT[/td]
[/tr]



5.10. دستورات متفرقه

[table border="1"][tr][td align="center"]وقفه IRQ ایجاد میشه [/td]
[td align="center"]BRK[/td]
[/tr]
[tr][td align="center"]هیچ کاری انجام نمیشه![/td]
[td align="center"]NOP[/td]
[/tr]



شنبه 02 اسفند 1393 - 21:39
وب کاربر ارسال پيام نقل قول تشکر گزارش
براي نمايش پاسخ جديد نيازي به رفرش صفحه نيست روي تازه سازي پاسخ ها کليک کنيد !



برای ارسال پاسخ ابتدا باید لوگین یا ثبت نام کنید.