You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Allegro4开发DOS GUI调用install_mouse()导致Dosbox段错误求助

解决方案

  • 调整初始化顺序,必须在set_gfx_mode()完成图形模式初始化后再调用install_mouse(),禁止在文本模式下提前安装鼠标驱动,避免DOSBox的VESA驱动与鼠标驱动抢占中断向量导致内存越界。
  • 编译时增加-DALLEGRO_USE_CONSOLE_MOUSE编译参数,强制Allegro使用轮询模式读取鼠标状态,替代默认的中断读取模式,规避DOSBox下中断触发频率过高导致的并发读写问题。
  • 读取Allegro鼠标全局变量时增加原子操作保护,修改preupdate方法的实现如下:
void MousePointerObject::preupdate()
{
    // 冻结鼠标状态保证读取时不会被中断更新篡改
    freeze_mouse();
    int cur_x = mouse_x;
    int cur_y = mouse_y;
    int cur_b = mouse_b;
    unfreeze_mouse();

    place(Vector<float>(cur_x, cur_y));

    static int held_buttons = 0;
    int changed = cur_b ^ held_buttons;
    pressed_ = changed & cur_b;
    released_ = changed & ~cur_b;
    held_buttons = cur_b;
}
  • 修改DOSBox配置文件中的鼠标相关参数:在dosbox.conf的[mouse]区段设置rawinput=false、sensitivity=80,关闭兼容性差的原生鼠标输入模式,降低鼠标事件触发频率。
  • 若以上方案均无效,可以弃用Allegro自带的鼠标驱动,直接通过DJGPP的int86接口调用DOS 33号中断读取鼠标状态,该接口为DOS标准接口,DOSBox对其兼容性达到100%,不会触发段错误。

内容的提问来源于stack exchange,提问作者DevShine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:57:04