求助:DOS环境下SVGA图形模式下,实现监测并显示鼠标的移动的问题?
我的基本思路是调用BIOS中断监测鼠标的移动,还原旧位置,在新位置上画鼠标,可是ShowMouse()执行结果是:鼠标可以移动一次,然后程序卡住,只能强行关闭dosbox模拟器.
程序代码:
#define MOUSEX 200 #define MOUSEY 200 int MouseInit() // 检查鼠标驱动是否安装 { int retcode; asm{ mov AX,0 INT 33h mov retcode,AX } if(retcode==0) // 鼠标安装失败 return 0; return retcode; } void SetXY() // 设置鼠标移动范围 { asm{ mov AX,7 mov CX,0 mov DX,639 // 水平范围0-639 INT 33h mov AX,8 mov CX,0 mov DX,479 // 垂直范围0-479 INT 33h } } void setmouse(INT16 x,INT16 y) // 设置鼠标显示位置 { asm{ MOV CX,x MOV DX,y MOV AX,4 INT 33H } xpos = x; ypos = y; } /* INT33h 功能0CH 功能描述:为鼠标事件设置处理程序 入口参数:AX=0CH CX=中断掩码 位0=1——鼠标指针位置发送变化 位1=1——按下左按钮 位2=1——释放左按钮 位3=1——按下右按钮 位4=1——释放右按钮 位5=1——按下中间按钮 位6=1——释放中间按钮 位7~15=0——保留 ES:DX=中断处理程序的地址 在进入中断处理程序时,有关寄存器的值含义: AX=中断掩码 BX=按键状态 CX=鼠标指针的水平位置 DX=鼠标指针的垂直位置 SI=水平位置的变化量 DI=垂直位置的变化量 出口参数:无*/ void interrupt mousehandler() { int newevent,newxpos,newypos; int i,j; asm{ MOV newevent,AX MOV newxpos,CX MOV newypos,DX } switch(_AX){ case 0x01: ConcealMouse(xpos,ypos,origin); //清除前一个鼠标图案 xpos=newxpos;ypos=newypos; // 获取新位置 for(i=0;i<16;i++) // 保留新位置原始图案 for(j=0;j<16;j++) origin[i*16+j]= GetPixel(xpos+j,ypos+i); DrawMouse(xpos,ypos); // 在新位置显示鼠标 } } void installtask(INT16 mask) { asm{ MOV AX,0CH MOV CX,mask MOV BX,SEG mousehandler MOV ES,BX LEA DX,mousehandler INT 33H } } void ShowMouse() { int i,j; if(MouseInit()==0){ SetSVGAMode(3); printf("no mouse available!\n"); exit(1); } SetXY(); setmouse(MOUSEX,MOUSEY); for(i=0;i<16;i++) // 保存鼠标将要显示的区域的图片信息到全局数组 for(j=0;j<16;j++) origin[i*16+j]= GetPixel(xpos+j,ypos+i); DrawMouse(xpos,ypos); // 在给定位置画鼠标 installtask(0x007f); // 打开中断 }
可以确定我画鼠标和还原鼠标位置原来图像的函数在单独测试时都是正确的,请问以上代码不能成功的原因?
我的显示模式为SVGA640*480,是中断函数的使用错误吗?
请高手指点,谢谢!