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

اینتراپت که معنای لغوی وقفه را میتوان به آن نسبت داد ، در حقیقت نیز چیزی جز یک وقفه نیست . میدانیم یک پردازنده در حین اجرای یک برنامه با سرعت ویژه خود ، دستورات را بایت به بایت انجام می دهد . در حین اجرای هر برنامه ، در زمانهای معین و دقیق و خیلی جزیی ، پردازنده کلیه اعمال عادی را برای زمانی معمولا کوتاه متوقف می کند . در اینجا اصطلاحا وقفه رخ داده است . پس از این که وقفه روی داد ، یکسری اعمال که از پیش تعیین شده و در حقیقت برنامه ای بیش نیست ، انجام میگیرد . در اینجا پس از اجرای تمام دستورات و به پایان رسیدن این برنامه ، پردازنده حالت وقفه را رفع میکند ، و به کار معمولی خود میپردازد ، این کار معمولی همیشه دنباله کاری است که از قبل انجام میشد و در حین آن وقفه روی داد . این توضیحات تنها یک نوع وقفه را مشخص میسازد . اما این تمام قضیه نیست ، هر پردازنده برای خود بیش از یک نوع وقفه داشته باشد . "دوستان خوب وبلاگ کمودور-آمیگا دات بلاگفا دات کام میدانند که در کامپیوتر کوچکی مثل کمودور 64 با حافظه در دسترس حدود 32 کیلوبایت نیاز به اینگونه برنامه ریزی ها میباشد ، در کامپیوترهای امروزی که 8 هسته ای هستند ، و پیچیدگی سخت افزاری فوق العاده زیادی دارند ، تمامی این مشکلات از روی دوش برنامه نویسان برداشته شده است و این مراحل به معماری سخت افزاری پردازنده و برنامه های فیکس روی آن واگذار شده است" . در اینجاست که هر کدام از این وقفه ها نسبت به تقدم خود بترتیب آزادی عمل را از پردازنده واگذار میگیرند و پس از انجام کار خود دوباره آن را به پردازنده واگذار می کنند . هر پردازنده برای وقفه های خود قوانین خاص خود را داراست ولی کارکرد وقفه چیزی جز روش بالا نیست .

مسئله دیگری که در اینجا وجود دارد اینست که بعضی از انواع وقفه ها علاوه بر اینکه به خودی خود در زمانهای معین توسط پردازنده آدرس دهی میشوند و انجام میگردند ، توسط سیگنالهایی که از منابع مختلف سرچشمه میگیرند نیز تولید میشوند . بدین معنا که برای نمونه ، یک سیگنال ویژه به پردازنده مینمایاند که وقت انجام شدن نوعی وقفه می باشد .

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

************************

کمودور 64 از کامپیوترهایی است که دارای 3 نوع وقفه مباشد که عبارتند از :

IRQ (interrupt request) R

NMI (non-maskable interrupt) R

BRK (break interrupt) R

اینتراپت نوع اول یا IRQ، اینتراپتی است که در هر ثانیه 60 بار انجام می شود . برنامه معمولی این اینتراپت برای مثال ، صفحه کلید ، مکان نما را تست می کند و در هر مورد عملیات ویژه آن را انجام می دهد .

اینتراپت نوع دوم اینتراپتی است که به هیچ وجه قابل چشم پوشی نیست و توسط زدن کلید Restoreاجرا می گردد . این نوع اینتراپت همچنین توسط سیگنالهای احتمالی که از درگاه افزایش RS-232 منشا میگیرند نیز تولید می شود . توجه به این نکته ضروری است که این نوع اینتراپت برعکس اینتراپت IRQ همیشه انجام نمیشود ، بلکه موقعی فعال میگردد که سیگنالی از دو منبع بالا دریافت کند .

اینتراپت نوع سوم ، اینتراپتی است که هرگاه پردازنده به یک کد صفر در حین انجام برنامه برسد ، فعال می گردد . بعبارت دیگر این اینتراپت موقعی انجام میگردد که پردازنده به یک دستور BRK برسد .

در کمودور64 محل شروع برنامه هر سه نوع اینتراپت در بایتهای بالای حافظه رام قرار گرفته است . بطوریکه عدد موجود در FFFF$ و FFFE$ نمایشگر آدرسی است که اینتراپت IRQوBRK به آن پرش می کنند . در حافظه FFFF$ عدد48$ و در حافظه FFFE$ عد FF$ قرار دارد . پس در حالت عادی اینتراپت IRQ و BRK به آدرس FF48 $ پرش می کنند . در FF48 $ کنترل می شود که آیا این اینتراپت از نوع IRQ است یا از نوع BRK و سپس بنا به وجود هرکدام ، دو کار مختلف انجام میگیرد .

چنانچه اینتراپت از نوع IRQ بود ، دستور jmp($0314 اجرا میگردد . طبق این دستور ، پردازنده به آدرسی که درون حافظه های 0315$,0314$ است پرش می کند . چنانچه اینتراپت از نوع BRK باشد ، دستور jmp($0316 اجرا می گردد . طبق این دستور پردازنده به آدرسی که درون حافظه های 0317$,0316$ است پرش میکند . دو حافظه FFFB$ و FFFA$ محل شروع برنامه اینتراپت NMI را نشان می دهند . در حافظه FFFA$ عدد 43$ و در حافظه FFFB$ عدد FE$ قرار دارد . پس در حالت عادی ، اینتراپت NMI به آدرس FE43 $ پرش می کند . در طی برنامه ای که در FE43 $ قرار دارد ، یک دستور jmp($0318 اجرا میگردد . طبق این دستور ، پردازنده به آدرسی که درون حافظه های 0319$,0318$ قرار دارد پرش می کند .

چون چهار بایت FFFA/FFFB و FFFE/FFFF مربوط به رام و غیر قابل تغییرند ، لذا فقط میتوان مستقیما آدرس حافظه های 0314/0315 را برای اینتراپت IRQ , 0316/0317 را برای BRK و 0318/0319 را برای اینتراپت NMI تغییر داد . این 6 بایت در قسمت پایین حافظه قرار دارند و مربوط به رم هستند ، میتوان آنها را بدلخواه تغییر داد .

الف - اینتراپت نوع IRQ

اینتراپت نوع IRQ ، همانطور که گفته شد در هر ثانیه 60 بار اتفاق می افتد ، مگر اینکه اینتراپت بطور کلی قطع شده باشد یا اینکه نوارخوان و یا دیسک گردان در حال انجام عملیات باشند . فرکانس این سرعت 60 هرتز را تراشه CIA1 کنترل می کند .

گفتیم محل شروع برنامه اینتراپت IRQ در دو بایت 0314/0315 قابل تغییر است . در حالت معمولی در حافظه 0314$ عدد 31$ و در حافظه 0315$ عدد EA$ قرار گرفته است . پس بطور معمولی همواره jmp$EA31 صورت می گیرد . توجه به این نکته ضروری است که در حافظه 0314$ بایت پایینی آدرس و در 0315$ بایت بالایی آدرس قرار میگیرد . در EA31 $ صفحه کلید و موتور ضبط صوت کنترل و تست می شوند و عملیات ویژه ای بنا به وضعیت آنان انجام می گیرد و بالاخره این زیر برنامه ها با دستور RTI تمام می شود و جریان کار را به پردازنده وامیگذارد . میتوان دو حافظه بالا را تغییر داد و محل دیگری از حافظه را برای زیر بنامه خود انتخاب کرد و برنامه را از آنجا توسط اینتراپت دنبال کرد . در این حالت در ثانیه 60 مرتبه زیربرنامه ما انجام می گردد . برای مثال میتوان آدرس C00D$ را درون 0314/0315 قرار داد . برنامه 1 این عمل را انجام می دهد .

.> C000 78 SEI

.> C001 A9 0D LDA #$C0

.> C003 8D 14 03 STA $0314

.> C006 A9 C0 LDA #$C0

.> C008 8D 15 03 STA $0315

.> C00B 58 CLI

.> COOC 60 RTS

توضیحات برنامه 1 :

خط C000 ، اینتراپت IRQ را قطع می کند .

خطوط C001 , C003 عدد 0D$ را داخل 0314$ میگذارد .

خطوط C006 , C008 عدد C0 $ را داخل 0315$ میگذارند .

خط C00B اینتراپت IRQ را روشن میکند .

*********************

ادامه دارد ....