int 10h , ah as 0d in assembly always returns 0 作为鼠标指针下像素的颜色

The int 10h , ah as 0d in assembly always returns 0 as the color of the pixel under the mouse pointer

代码允许玩家移动鼠标,当玩家按下左键时,他将按下的像素的颜色与红色进行比较。 int 10h, ah as 0d always returns 0作为像素的颜色,怎么办?

mov ax, 0
int 33h
mov ax,1h
int 33h
check:
    mov ax, 3
    int 33h
    cmp bx, 1
    jne check
mov ax, 4
int 33h
xor ax, ax
mov ah, 0Dh
mov bh, 0
int 10h
cmp al, 0100b
je print_white_screen

我的猜测是像素被报告为黑色,因为鼠标指针的轮廓就是这样。 BIOS 不会补偿在鼠标指针下显示的颜色。尝试隐藏鼠标指针 (int 33h, ah = 02),读取像素,然后重新显示指针 (int 33h, ah = 01)。

  • 根据视频模式,您可能探测到错误的网点。
    鼠标函数 03h 始终 returns X 值在 0-639 范围内,Y 值在 0-199 范围内,无论视频模式如何。但是视频功能 0Dh 确实需要屏幕相关坐标。

  • 鼠标报告的坐标为鼠标光标的热点。确保它对应于鼠标蒙版中的 ON 像素。您可以使用鼠标功能 09h 自己定义这些。或者偏移报告的坐标,以便参考标准鼠标箭头的中间。这是一个即将开启的点。

  • cmp al, 0100b 为什么你期望颜色是红色?从鼠标函数 00h 获得的标准鼠标箭头将是 white。最好使用 cmp al, 15.

  • 如果您正在测试背景中的像素,那么您应该在要求 BIOS 读取该像素之前隐藏鼠标箭头(鼠标功能 02h) .您的代码当前对鼠标函数 04h!

  • 进行了冗余调用