עבור לתוכן

להפעיל פסיקת עכבר באסמבלי

Featured Replies

פורסם

שלום רב,

אסמבלי לדוס-

אוקיי, אני יודע להפעיל את העכבר באסמבלי - mov ax,1 ו int 33h. אך מה הלאה? איפה נשמרים המיקום ומצב הכפתורים?

תודה

פורסם

יש לי כאן קוד ב- C, אבל אני מניח שתדע להשתמש בו בצורה נכונה גם בASM:


#include <dos.h>
//must defune variable: 'union REGS r;'

int init_mouse()
{
int86(0x33, &r, &r);
return r.x.ax;
}

int mouse_x()
{
r.x.ax=3;
int86(0x33,&r,&r);
return r.x.cx;
}
int mouse_y()
{
r.x.ax=3;
int86(0x33,&r,&r);
return r.x.dx;
}

int mouse_button()
{
r.x.ax=3;
int86(0x33,&r,&r);
return r.x.bx;
}

int mouse_onoff(int s)
{
r.x.ax=s; //1- on, 2- off
int86(0x33, &r, &r);
}

void mouse_restrict(int x1,int y1,int x2,int y2)
{
r.x.ax=7;
r.x.cx=x1;
r.x.dx=x2;
int86(0x33,&r,&r);
r.x.cx=y1;
r.x.dx=y2;
int86(0x33,&r,&r);
}


void mouse_shape(int shape)
{
struct SREGS s;
union REGS r1;
int mask[][32]={
//hand
0xe1ff,0xe1ff,0xe1ff,0xe1ff,0xe1ff,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x1e00,0x1200,
0x1200,0x1200,0x13ff,0x1249,0x1249,0x1249,
0x9001,0x9001,0x9001,0x8001,0x8001,0x8001,
0xffff,0x0000,

//arrow
0xffff,0xffff,0xe003,0xf003,0xf803,0xfc03,
0xfe03,0xfc03,0xf803,0xf043,0xe0e3,0xc1f3,
0x83fb,0x07ff,0x8fff,0xdfff,0x0000,0x0000,
0x1ffc,0x0804,0x0404,0x0204,0x0104,0x0204,
0x0444,0x08a4,0x1114,0x220c,0x4404,0x8800,
0x5000,0x2000,

//hour glass
0x0000,0x0000,0x0000,0x0000,0x8001,0xc003,
0xf00f,0xfc3f,0xfc3f,0xf00f,0xc003,0x8001,
0x0000,0x0000,0x0000,0x0000,0xffff,0x8001,
0xffff,0x8001,0x4002,0x2004,0x1008,0x0240,
0x0240,0x0810,0x2004,0x4002,0x8001,0xffff,
0x8001,0xffff,

//para
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0xffff,0xffff,
0xffff,0x0007,0x0007,0xeee7,0x0007,0x0007,
0xeee7,0x0007,0x0007,0xeee7,0x0007,0x0007,
0xeee7,0xeee7,

//none
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000
};

r.x.ax=9;
r.x.bx=0;
r.x.cx=0;
r.x.dx=(unsigned)&mask[shape];
segread(&s);
s.es=s.ds;
int86x(0x33,&r,&r1,&s);
}

אתה יכול גם לחפש בGOOGLE.

ד.א. חבל שאי אפשר לצרף קבצי C ישירות(בלי לכווץ לWINZIP).

פורסם

כמובן, כדאי לקרוא את X,Y ומצב הכפתורים בקריאה אחת בלבד ל-int 33.

אחת הדרכים המקובלות היא להכניס handler פשוט לפסיקה של הtimer. ב-handler פשוט תקרא את המיקום הנוכחי של העכבר ואז תדחוף אותו למשתנים.

עכשיו בתוכנית אתה יכול פשוט לקרוא את המשתנים האלה מתי שאתה רוצה והנה יש לך טיפול פשוט בעבר.

יש כאן בעייה קטנה של סינכרון (בד"כ אתה רוצה לוודא שכל המשתנים נקראים ביחד או שהם לא יעודכנו בזמן העבודה איתם) אבל במקרה של שימוש פשוט בעכבר זה ממש לא נורא.

פורסם
  • מחבר

גדול..!

יש סיכוי שתכניס לי פה כמה שורות קוד איך לכתוב handler לטיימר..?

שוב תודה

פורסם

עברו הרבה שנים מאז. אני מניח שאתה עובד ב-DOS או לפחות על x86 שרץ ב-real mode.

זה אולי יעזור:

ftp://hornet.madtracker.org/mirrors/hornet/code/hardware/keyboard/pxdtut6.zip

ב-SWAG יש הרבה מידע על תכנות low level, אבל הרוב בפסקל:

ftp://ftp.gdsoft.com/pub/swag/allswags.zip

מצד שני, אני כמעט בטוח שתמצא שם את מה שאתה מחפש.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים