怎么才能在图形模式下吧鼠标给请出来?(dos下)

wendaosheyu 2009-02-22 03:36:08
搜了半天了,一点成果都没有,知道的帮下忙吧
在文本模式在用
MOV AX,01H
INT 33H
可以把文本模式的光标弄出来,图形模式的不行啊
...全文
184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtdumpling 2009-03-03
  • 打赏
  • 举报
回复
mark.

6楼太狠了...
wendaosheyu 2009-03-03
  • 打赏
  • 举报
回复
根据 cnzdgs 的提示用 int 33 弄了一个只有一个白点的光标
以后再慢慢发展有形状的光标

To:三楼的
有时候一个提示比一大堆代码其实更有价值
  • 打赏
  • 举报
回复
WritePort是一个宏

%macro WritePort 2
MOV DX,%1
MOV AL,%2
OUT DX,AL
%endmacro
  • 打赏
  • 举报
回复
针对 8042设置芯片参数。芯片的具体说明你到网上查吧很多的。
这段代码。用在32位保护模式下。dos下修改一下也可以使用的。
用到的一些变量
SYSMOUSEBUF: EQU 0x4000 ;鼠标指针双缓冲地址
SYSTB: EQU 0x10000
以下代码对8259a的设置
;初始化8259A
SetChip8259A:
PUSH EBP
MOV EBP,ESP
CLI
;按顺序发每次打开和关闭状态8259a端口才会变化

; 发送 ICW1 : 使用 ICW4,级联工作
WritePort 0x20,0x11
WritePort 0xa0,0x11

; 发送 ICW2,中断起始号从 0x30 开始(第一片)及 0x38开始(第二片)
WritePort 0x21,0x30 ;0-7个中断表示0-7个IDT表数组下标,键盘中断是2那么对应的就是1号下标(数组下标从0开始数)
WritePort 0xa1,0x38

; 发送 ICW3
WritePort 0x21,0x4 ;主片IRQ2和从片IRQ0相连
WritePort 0xa1,0x2

; 发送 ICW4
WritePort 0x21,0x1 ;发送1表示工作在8086模式下
WritePort 0xa1,0x1

; 设置中断屏蔽位 OCW1 ,屏蔽所有中断请求
; 由于主片的 IRQ2 与从边相连,故不屏蔽它
WritePort 0x21,0xfb ;屏蔽中断11111011b屏蔽中断.0 1 (2不关)3 4 5 6 7
WritePort 0xa1,0xff ;关闭从片所有中断
STI
MOV ESP,EBP
POP EBP
RET
;设置中断向量表
CreateIdtTable:
MOV ECX,256
PUSH CS
POP ES
MOV ESI,IDT_STRUCT
MOV EDI,SYSTB ;IDT表存放地址
s:
MOV EAX,[ES:ESI]
MOV [DS:EDI],EAX
ADD ESI,4
ADD EDI,4
MOV EAX,[ES:ESI]
MOV [DS:EDI],EAX
SUB ESI,4
ADD EDI,4
LOOP s
MOV EAX,256*8 ;所有IDT表的总个数
MOV [DS:EDI],AX
MOV EAX,SYSTB
MOV [DS:EDI+2],EAX ;IDT表所在的位置
LIDT [DS:EDI]
RET
  • 打赏
  • 举报
回复
对于鼠标我也疑惑很长时间。
这是我做os练习的时候写的鼠标驱动。你可以看看。主要是要针对8259设置芯片参数。不知道你微机原理和汇编基础怎么样。

[BITS 32]
[ORG 0x0]
;鼠标中断处理程序
INT_MOUSE:
PUSHAD
PUSHF
;刷新鼠标所在区域

ReadPort 0x60
MOV AH,0

CMP [DS:SYSVAR+0x10],BYTE 0
JZ c0
CMP [DS:SYSVAR+0x10],BYTE 1
JZ c1
CMP [DS:SYSVAR+0x10],BYTE 2
JZ c2
c0:
jmp button
c1:
jmp xpos
c2:
jmp ypos
button:
TEST AL,0x1 ;1=leftbutton 2=rightbutton
JZ bt0

bt0:
MOV [DS:SYSVAR+0x11],BYTE AL ;鼠标按键给变量
ADD [DS:SYSVAR+0x10],BYTE 1 ;读取累加器+1
JMP rt ;处理完毕跳走


xpos:

ADD [DS:SYSVAR+0x10],BYTE 1 ;读取累加器+1
;计算符号加减
CBW
MOV [DS:SYSVAR+0x12],WORD AX ;x坐标放到零时变量
MOV AX,[DS:SYSVAR+0x0C] ;读出坐标变量内容与鼠标移动偏移相加
ADD AX,[DS:SYSVAR+0x12] ;x坐标+移动偏移
MOV [DS:SYSVAR+0x12],WORD 0 ;清空临时变量

CMP AX,0xf9ff
JNG x1
MOV [DS:SYSVAR+0x0C],WORD 0xF9FF
JMP x2
x1:
CMP AX,0xFA00
JNG x2
MOV [DS:SYSVAR+0x0C],WORD 0xFA00
x2:
MOV [DS:SYSVAR+0x0C],WORD AX ;累加坐标放到坐标变量中


JMP rt ;处理完毕跳走
ypos:
MOV [DS:SYSVAR+0x10],BYTE 0 ;清零读取累加器
CBW
;ADD [DS:SYSVAR+0x10],BYTE 1 ;读取累加器+1
;SHR AL,1
NEG AX
MOV [DS:SYSVAR+0x12],WORD AX ;y坐标放到零时变量
MOV AX,[DS:SYSVAR+0x0E] ;读出坐标变量内容与鼠标移动偏移相加
ADD AX,[DS:SYSVAR+0x12] ;y坐标+移动偏移
MOV [DS:SYSVAR+0x12],WORD 0 ;清空临时变量
CMP AX,32767
JNG y1
MOV [DS:SYSVAR+0x0E],WORD 0
JMP y2
y1:
CMP AX,598
JNG y2
MOV [DS:SYSVAR+0x0E],WORD 598
y2:
MOV [DS:SYSVAR+0x0E],WORD AX ;累加坐标放到坐标变量中
;保存鼠标将要显示的区域
; PUSH WORD 8
; PUSH WORD 8
; PUSH WORD [DS:SYSVAR+0x0E];y
; PUSH WORD [DS:SYSVAR+0x0C];x
; CALL GetCurLastRect
;区域恢复
; PUSH DWORD SYSMOUSEBUF
; PUSH WORD 0x80
; PUSH WORD 8
; PUSH WORD 8
; PUSH WORD [DS:SYSVAR+0x16];y
; PUSH WORD [DS:SYSVAR+0x14];x
; CALL DrawPixelBuf
push word 0 ;0=常规拷贝,1=与目标or,2=与目标and,3=与目标xor
PUSH WORD [DS:SYSVAR+0x16];endy
PUSH WORD [DS:SYSVAR+0x14];endx
MOV AX,[DS:SYSVAR+0x16];endy
MOV BX,[DS:SYSVAR+0x14];endx
ADD AX,8
ADD BX,8
PUSH AX
PUSH BX
PUSH WORD [DS:SYSVAR+0x16];starty
PUSH WORD [DS:SYSVAR+0x14];startx
CALL BitBlt
;显示鼠标光标
PUSH DWORD SYSMOUSEBUF+0x80;鼠标像素所在位置
PUSH WORD 0x80
PUSH WORD 8
PUSH WORD 8
PUSH WORD [DS:SYSVAR+0x0E];y
PUSH WORD [DS:SYSVAR+0x0C];x
CALL DrawPixelBuf
MOV AX,[DS:SYSVAR+0x0E];y
MOV BX,[DS:SYSVAR+0x0C];x
MOV [DS:SYSVAR+0x16],AX;y
MOV [DS:SYSVAR+0x14],BX;x
JMP rt
rt:

MOV AL,0x20
OUT 0x20,AL
OUT 0xA0,AL
POPF
POPAD

IRET
;----------------------------------------------------------------------------
;通过点阵信息生成一个16位色的像素点阵
;鼠标指针是个8*8位的点阵也就是8个子节
;0x4000-0x40ff ;鼠标指针数据256byte
;----------------------------------------------------------------------------
SetCursorColor:
PUSH EBP
MOV EBP,ESP
SUB ESP,2 ;开辟局部变量

MOV ESI,0x4000
MOV EDI,0x4080
cursor:
MOV BL,[DS:ESI]
MOV ECX,8
MOV [ESP+0],WORD 1 ;指针轮廓开关
lopshl:
PUSH CX
SHL BL,1
JC matrix ;CF是否溢出是否有点阵数据
MOV AX,[ESP+0+2] ;获得绘制开关-0xffff表示矩阵开始
CMP AX,2
JNZ nomatrix ;如果指针矩阵还没有开始
MOV [DS:EDI],WORD 0xFFFF ;鼠标轮廓内部用白色填充
JMP goon
nomatrix: ;处理鼠标光标影响没处理时的空点阵
MOV [DS:EDI],WORD 0x1111 ;光标外形以外的部分不显示.也就是把鼠标光标的形状挖出来
JMP goon
matrix:
ADD [ESP+0+2],WORD 1 ;如果有点阵那么标志设置1表示点阵开始
MOV [DS:EDI],WORD 0x0000 ;鼠标轮廓用黑色
goon:
ADD EDI,2
POP CX
LOOP lopshl
INC SI
CMP SI,0x4008
JNZ cursor
;保存鼠标将要显示的区域
PUSH WORD 8
PUSH WORD 8
PUSH WORD [DS:SYSVAR+0x0E];y
PUSH WORD [DS:SYSVAR+0x0C];x
CALL GetCurLastRect

MOV ESP,EBP
POP EBP
ret
;---------------------------------------------------------------------------
;获得指定区域的像素
;并保存到鼠标指针的第一个128b的缓冲区
;PUSH WORD matrix_y
;PUSH WORD matrix_x
;PUSH WORD starty
;PUSH WORD startx
;--------------------------------------------------------------------------
GetCurLastRect:
PUSH EBP
MOV EBP,ESP
SUB ESP,4
XOR EAX,EAX
XOR EBX,EBX
MOV AX,[ESP+8+4] ;x
MOV BX,[ESP+10+4] ;y
MOV [ESP+0],AX
MOV [ESP+2],BX
ADD [ESP+12+4],AX ;计算endx
ADD [ESP+14+4],BX ;计算endy
MOV EDI,SYSMOUSEBUF ;鼠标指针缓冲区地址
my:
MOV BX,[ESP+10+4]
MOV [ESP+2],BX ;重置x坐标
mx:
PUSH EDI
PUSH WORD 1 ;从缓冲区取
PUSH WORD [ESP+2+6] ;y
PUSH WORD [ESP+0+8] ;x
CALL GetPoint
POP EDI
MOV [DS:EDI],AX
ADD EDI,2
ADD [ESP+2],WORD 1
MOV BX,[ESP+2]
CMP BX,[ESP+14+4]
JNZ mx
ADD [ESP+0],WORD 1
MOV BX,[ESP+0]
CMP BX,[ESP+12+4]
JNZ my
MOV ESP,EBP
POP EBP
ret 0x8
;初始化鼠标中断
InitMouse:

PUSH EBP
MOV EBP,ESP



;设置中断表项地址
MOV EAX,INT_MOUSE
MOV CL,16
MOV [DS:SYSTB+0x3C*8],WORD AX
SHR EAX,CL
PUSH CS
POP CX
MOV [DS:SYSTB+2+0x3C*8],WORD CX
MOV [DS:SYSTB+6+0x3C*8],WORD AX

CLI
XOR EDX,EDX
XOR EAX,EAX
MOV DX,0xA1
IN AL,DX
AND AL,11101111b ;打开鼠标中断
OUT DX,AL

;对 8042 键盘控制芯片进行编程

;Enable auxiliary device interface - reset bit 5 of the command byte.
;WritePort 0x64,0xa8 ;允许 mouse 接口 0xa8 = 10101000b
;Write to auxiliary device - transmit next byte written to 60H input buffer to auxiliary device.
;WritePort 0x64,0xd4 ;通知 8042 下个字节的发向 0x60 的数据将发给 mouse 0xd4 = 11010100b
;WritePort 0x60,0xf4 ;允许 mouse 发数据 0xf4 = 11110100b
;WritePort 0x64,0x60 ;通知 8042,下个字节的发向 0x60 的数据应放向 8042 的命令寄存器 0x60 = 01100000b
;WritePort 0x60,0x47 ;许可键盘及 mouse 接口及中断 0x47 = 01000111b

mov bl,0xa8 ; enable mouse cmd
call kb_cmd
call kb_read ; read status

mov bl,0x20 ; get command byte
call kb_cmd
call kb_read
or al,3 ; enable interrupt
mov bl,0x60 ; write command
push eax
call kb_cmd
pop eax
call kb_write

mov bl,0xd4 ; for mouse
call kb_cmd
mov al,0xf4 ; enable mouse device
call kb_write
call kb_read ; read status return


STI
MOV ESP,EBP
POP EBP
ret
cnzdgs 2009-02-22
  • 打赏
  • 举报
回复
可以自己写鼠标驱动,也可以用int 33h,如果是int 33h不支持的显示模式,可以定时调用用int 33h的ax=3功能查询鼠标位置,自绘光标。
cxdzxc 2009-02-22
  • 打赏
  • 举报
回复
你试试运行下MOUSE.COM看有效果不,如果这样不行,那就要麻烦些了,然后建议你可以在群里(BIOS与32位简单内和探究群)发问,这样可以更加快捷的得到答案

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧