;=================================================
; 三国英杰传游戏修改(游戏中支持键盘)中间汇编代码
; 作者: waklin
; Email: [email protected]
; QQ: 251710001
; 原理如下
; 1、游戏运行时改变键盘中断向量(int9)为自定义的键盘中断处理程序。
; 2、自定义的键盘处理程序中拦截SPACE、ESC按键的状态,分别用来模拟鼠标左键和鼠标右键按下/释放的操作。
; 3、游戏运行时改变鼠标中断向量(int33h)为自定义的鼠标中断处理程序。
; 4、自定义的鼠标中断处理中拦截3、12号功能:
; *** 核心部分 ***
; 12号功能为"为鼠标事件设置处理程序",将"鼠标事件处理程序"指向自定义的处理程序。
; 在自定义的"鼠标事件处理程序"中捕获所有mouse事件,保存mouse状态。
; 3号功能为"读取鼠标位置及其按钮状态",游戏中就是通过这个功能号来获取鼠标按键状态,判断用户是否按下鼠标操作。
; 用户程序读mouse状态的时候就把自己维护的状态返回给游戏。
; *** ******* ****
; 5、在自定义的键盘中断中触发SPACE、ESC键时,改变mouse状态。
; 版权所有:
; 日期:2008-05-24
;=================================================
assume cs:codesg
codesg segment
start: nop
jmp begin
strOutput1 db 'Modify By Waklin; Email: [email protected]; QQ: 251710001',0
strOutput2 db 'Please Press KEY<ESC> Enter Game!',0
;=================================================
; 新的键盘中断处理程序
;=================================================
int9: push ax
push dx
push cx
push ds
mov ax,0
mov ds,ax
in al,60h ; 读取60h端口的键盘扫描码
pushf
call dword ptr ds:[200h] ; 调用旧的int9中断例程(旧的键盘中断处理程序的入口地址放在0:200h处)
spacepress:
cmp al,39h ; 按下SPACE键 (模拟鼠标左键按下)
jne spacerelease
mov byte ptr ds:[218h],1 ; 0:218h处保存按键状态位
jmp int9ret
spacerelease:
cmp al,0b9h ; 松开SPACE键 (模拟鼠标左键松开)
jne escpress
mov byte ptr ds:[218h],0
jmp int9ret
escpress: ; 按下ESC键 (模拟鼠标右键按下)
cmp al,01h
jne escrelease
mov byte ptr ds:[218h],10b
jmp int9ret
escrelease: ; 松开ESC键盘