کاری که BIU انجام میدهد این است که دستورالعمل ها را یکی یکی از حافظه می خواند و در صف (queue) قرار میده , در نتیجه دستورالعمل ها برای EU آماده هستند. بدین ترتیب این دو واحد با هم و به صورت هماهنگ کار میکنند.
خانواده پردازنده های 8086 (80X86) دارای چهار ثبات( حافظه هایی سریع برای انجام محاسبات و سایر اعمال پردازنده) عمومی به نامهای AX , BX ,CX ,DX و... هستند البته تعداد این ثباتها بیشترند ( دو ثبات شاره گرپشته SP , اشاره گر پایه BP, دو ثبات ایندکس منبع SI, ایندکس مقصد DI, یک ثبات دستورالعمل IP, یک ثبات وضعیت Flag register و چهار ثبات سگمنت با نامهای CS,DS,SS,ES که همه این ثباتها 16 بیتی هستند) که برای کار ما همین چهار ثبات (AX,BX,CX,DX) کافی هستند.
ثباتهای عمومی برای کار با وقفه ها ( توضیح میدم ) بسیار خوبند. ساختار هریک از این ثباتها 16 بیتی است که تمام این چهار ثبات از دو قسمت 1 بایتی تشکیل شده اند که با پسوند H و L مشخص میشوند برای مثال ثبات AX از دو بخش AH (بایت بالا) و AL (بایت پیین) تشکیل شده.
ثبات AX : برای انجام اعمال محاسباتی ورودی و خروجی
ثبات BX: برای آدرس دهی و اعمال محاسباتی
ثبات :CX به عنوان شمارنده به کار گرفته میشود
ثبات :DX این ثبات , ثبات داده در نظر گرفته میشود و برای بعضی از اعمال ورودی و خروجی به کار گرفته میشود.
" تا اینجا تنها چیزی که نیاز است مطالب رنگی بالا است. "
شروع:
وقفه(Interrupt) سیگنالی است که از طرف نرم افزار یا سخت افزار به CPU داده می شود و از CPU عملی رو درخواست میکند. وقفه ها به دو دسته وقفه های سخت افزاری و وقفه های نرم افزاری تقسیم میشوند.
وقفه های سخت افزاری در اثر بروز اعمال ویژه ای اتفاق می افتند.
وقفه های نرم افزاری به دوسته تقسیم میشوند:
- وقفه های سیستم.
- وقفه های نوشته شده توسط برنامه نویس.
تعداد وقفه های سیستم 256 است که از 0 تا 255 شماره گذاری شده اند. علاوه بر این 256 وقفه خود برنامه نویس میتواند وقفه ها مورد نیاز رو بنویسد. وقفه های سیستم نیز به دو دسته تقسیم میشوند
- وقفه های DOS
- وقفه های BIOS
(BIOS زیر برنامه های سطح پایین و DOS زیر برنامه های سطح بالاتری را برای انجام اعمال ورودی و خروجی انجام میدهد)
هر وقفه با شماره ای در مبنای 16 مشخص میشود مثل وقفه های 5H,10H,33H و ... .
(یک کم تخصصی: هر وقت وقفه ای اتفاق می افته اجرای برنامه موقتا قطع میشه و محتویات CX و IP به stack منتقل میشه و کنترل به زیر برنامه ای برای پاسخگویی به وقفه میره و بعد از اتمام زیر برنامه محتویات CX و IP از stack فراخوانی میشوند و اجرای برنامه ها ادامه پیدا میکنه)
هر وقفه با توجه به کاربردش میتواند دارای توابعی باشد که هر تابع کار خاص خو را نجام میدهد.
وقفه مربوط به موس چگونه است؟
برای کار با موس باید از وقفه 33H استفاده کرد. که تعداد توابع آن زیاد است. شماره وقفه را در AX قرار می دهیم و وقفه را فراخوانی میکنیم ( در ادامه بصورت کامل توضیح میدم )
معرفی تعدادی از توابع وقفه 33H :
تابع 0000H :
این تابه برای reset کردن درایور موس و خواندن موقعیت موس در زمان اجرای وقفه است. بدین صورت که ابتدا در ثبات AX مقدار 0000H را قرار میدهیم و وقفه را فراخوانی میکنیم. بعد از فراخوانی وقفه(توضیح میدم) در AX موقعیت درایور موس قرار میگیرد اگر 0000H بود یعنی سخت افزار یا درایور نصب نیست و اگر ffffH بود سخت افزار یا درایور نصب است. در داخل BX نوع دکمه های موس قرار داده میشود که مهمترین آنها 0003H به معنی سه دکمه ای و ffffH به معنی 2 دکمه ای است
تابع 0001H :
این تابع موس را ظاهر میکه.
فقط کافیه AX رو 0001H قرار بدید و وقفه رو فراخوانی کنید.
تابع 0002H :
این تابع عکس عمل تابع 0001H رو انجام میده. فقط اگر دو بار وقفه رو با تابع 0002H فراخوانی کنید دو باره cursor را نمایش میدهد.
تابع 0003H :
این تابع را میتوان ترکیبی از دو تابع بعد به حساب آورد (البته با تفاوت هایی). این تابع موقعیت موس در صفحه و کلید فشرده شده را برمیگرداند. بدین صورت که :
در AX مقدار 0003H قرار میدهید و وقفه را فراخوانی می کنید . اکنود در BX شماره کلید فشرده شده قرار میگیرد .اگر 0 بود کلید چپ و اگر 1 بود کلید راست واگر 2 بود کلید میانی فشرده شده است. CX شماره ستونی که موس در آن قرار دارد را میدهد و DX شماره سطر را میدهد.
در محیط متن هر کاراکتر را 8X8 در نظر بگیرید. یعنی موقعیت موس روی هر کاراکتر 64 حالت دارد.
چگونه وقفه را فراخوانی کنیم: وقفه را میتوان با دستورات اسمبلی یا توابع زبان C فراخوانی کرد . ما با استفاده از تابع int86 این کار را انجام میدهیم.
بدین صورت که (ثبات مقصد , ثبات پایه , شماره وقفه)int86.
ابتدا باید متغیری از نوع ثبات ایجاد کنیم و مقدار تابع را در آن قرار دهیم و بعد وقفه را فراخوانی کنیم.
Header file مربوط به ثبات ها است.
تابع active در اینجا درایور موس را فعال میکند
#include<...>
#include<...>
#include
#include<...>
#include<...>
void active(){
union REGS r1,r2;
r1.x.ax=0;
int86(0x33,&r1,&r2);
}
تابع show در اینجا موس را نمایش میدهد:
void show(){
union REGS r1,r2;
r1.x.ax=1;
int86(0x33,&r1,&r2);
}
تابع hide در اینجا موس را مخفی می کند:
void hide(){
union REGS r1,r2;
r1.x.ax=2;
int86(0x33,&r1,&r2);
}
تابع click با گرفتن کلید چپ نام کلید و مختصات آن را در صفحه را چاپ میکند:
void click(){
union REGS r1,r2;
do{
r1.x.ax=3;
int86(0x33,&r1,&r2);
delay(100);
} while(r2.x.bx==0);
cout<<"left click \n";
cout<<"x="<<.r2.x.cx;
cout<<" y="<<.r2.x.dx;
getch();
}
نمونه مثال زیر رو ببینید:
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<dos.h>
union REGS in,out;
int callmouse()
{
in.x.ax=1;
int86(51,&in,&out);
return 1;
}
void mouseposi(int &xpos,int &ypos,int &click)
{
in.x.ax=3;
int86(51,&in,&out);
click=out.x.bx;
xpos=out.x.cx;
ypos=out.x.dx;
}
int mousehide()
{
in.x.ax=2;
int86(51,&in,&out);
return 1;
}
void setposi(int &xpos,int &ypos)
{
in.x.ax=4;
in.x.cx=xpos;
in.x.dx=ypos;
int86(51,&in,&out);
}
int main()
{
int x,y,cl,a,b;
clrscr();
int g=DETECT,m;
initgraph(&g,&m,"c:\tc\bgi");
a=100;
b=400;
setposi(a,b);
callmouse();
do
{
mouseposi(x,y,cl);
gotoxy(10,9);
printf("\n\tMouse Position is: %d,%d",x,y);
printf("\n\tClick: %d",cl);
printf("\n\tPress any key to hide the mouse");
}while(!kbhit());
getch();
mousehide();
printf("\n\n\tPress any key to Exit");
getch();
}
فقط کاربران عضو می توانند این بخش را مشاهده کنند...