C51UART 2015-08-13 03:03 采纳率: 0%
浏览 2050

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,编译环境为turbo c.是中断函数的使用错误吗?
请高手指点,谢谢!










  • 写回答

1条回答 默认 最新

  • devmiao 2015-08-13 23:20
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题