`
emowuyi
  • 浏览: 1477892 次
文章分类
社区版块
存档分类
最新评论

Turbo C使用的汇编函数 -- 鼠标管理函数

 
阅读更多

上面2篇文章《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》和《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》给出了图形代码,本篇给出鼠标管理TC函数汇编码文件。该代码很简单,而且对速度没很高的要求,完全可用纯C/C++写,但是在DOS年代,即使速度稍有提高以及代码长度缩短,也愿意用汇编码或插入汇编;鼠标功能使用int 33h,要在程序中使用鼠标,必须安装鼠标驱动程序(指纯DOS环境),鼠标驱动一般有2种形式,一是mouse.sys,必须在DOS下的config.sys文件中安装:device=mouse.sys,另外一种是mouse.com,不必在config.sys中安装,在autoexec.bat或者其它批命令文件或者直接在DOS命令行中运行后,以TSR形式驻留内存。

/*mouse.h*/

#ifndef__MOUSE__
#define__MOUSE__

externintMouseFlag;

#ifdef__cplusplus
extern"C"{
#endif

/*初始化,如鼠标存在,MouseFlag=1,否则MouseFlag=0,返回该值*/
intMouse_Init(void);
/*置鼠标位置到X,Y*/
voidMouse_SetXY(intx,inty);
/*取鼠标当前位置到X,Y*/
voidMouse_GetXY(int*x,int*y);
/*打开鼠光标*/
voidMouse_Show(void);
/*关闭鼠光标*/
voidMouse_Hide(void);
/*如鼠光标在坐标(x1,y1)-(x2,y2)内返回1,否则返回0*/
intMouse_InBox(intx1,inty1,intx2,inty2);
/*取按钮按下信息b=0左按钮,b=1右按钮,b=2中按钮*/
intMouse_Press(intb);
/*取按钮放开信息b=0左按钮,b=1右按钮,b=2中按钮*/
intMouse_Rel(intb);
/*返回当前按钮状态,有按钮按下返回非0,否则返回0*/
intMouse_State(void);
/*设置鼠光标类型,X,Y为光标热点,Pattern为光标点阵地址*/
voidMouse_SetCursor(intX,intY,voidfar*Pattern);

#ifdef__cplusplus
}
#endif

#endif

;mouse.asm

includetasm_c.inc

DATASEG

PUBLIC_MouseFlag

_MouseFlagdw
0
MouseCurFlagdw
0

CODESEG

PUBLIC_Mouse_Init
PUBLIC_Mouse_SetXY
PUBLIC_Mouse_GetXY
PUBLIC_Mouse_Show
PUBLIC_Mouse_Hide
PUBLIC_Mouse_State
PUBLIC_Mouse_Press
PUBLIC_Mouse_Rel
PUBLIC_Mouse_InBox
PUBLIC_Mouse_SetCursor
;
;Mouse_Init(
void)
;
PROC_Mouse_Init

cmp[word_MouseFlag],
0
jne@@
1
xorax,ax
int33h
cmpax,
0
je@@
1
mov[_MouseFlag],bx
xorcx,cx
xordx,dx
movax,
4
int33h
@@
1:
movax,[_MouseFlag]
ret
ENDP
;
;
voidMouse_SetXY(intx,inty)
;
PROC_Mouse_SetXY

ARGx:word,y:word

movcx,[x]
movdx,[y]
movax,
3
int33h
ret
ENDP
;
;
voidMouse_GetXY(int*x,int*y)
;
PROC_Mouse_GetXY

ARGx:DPTR_,y:DPTR_

movax,
3
int33h
LES_bx,[x]
mov[ES_bx],cx
LES_bx,[y]
mov[ES_bx],dx
ret
ENDP
;
;
voidMouse_Show(void)
;
PROC_Mouse_Show

cmp[word_MouseFlag],
0
je@@
1
cmp[wordMouseCurFlag],
0
jne@@
1
movax,
1
int33h
mov[wordMouseCurFlag],
1
@@
1:
ret
ENDP
;
;
voidMouse_Hide(void)
;
PROC_Mouse_Hide

cmp[word_MouseFlag],
0
je@@
1
cmp[wordMouseCurFlag],
0
je@@
1
movax,
2
int33h
mov[wordMouseCurFlag],
0
@@
1:
ret
ENDP
;
;
voidMouse_SetCursor(intx,inty,voidfar*prttern)
;
PROC_Mouse_SetCursor

ARGx:word,y:word,prttern:farptr

movax,
9
movbx,[x]
movcx,[y]
lesdx,[dwordprttern]
int33h
ret
ENDP
;
;
intMouse_State(void)
;
PROC_Mouse_State

movax,
3
int33h
movax,bx
ret
ENDP
;
;
intMouse_Press(intb)
;
PROC_Mouse_Press

ARGb:word

movax,
5
movbx,[b]
int33h
movax,bx
ret
ENDP
;
;
intMouse_Rel(intb)
;
PROC_Mouse_Rel

ARGb:word

movax,
6
movbx,[b]
int33h
movax,bx
ret
ENDP
;
;
intMouse_InBox(intx1,inty1,intx2,inty2)
;
PROC_Mouse_InBox

ARGx1:word,y1:word,x2:word,y2:word

movax,[_MouseFlag]
cmpax,
0
je@@
3
movax,
3
int33h
xorax,ax
movbx,[x1]
cmpbx,[x2]
jle@@
1
xchgbx,[x2]
@@
1:
cmpcx,bx
jl@@
3
cmpcx,[x2]
jg@@
3
movbx,[y1]
cmpbx,[y2]
jle@@
2
xchgbx,[y2]
@@
2:
cmpdx,bx
jl@@
3
cmpdx,[y2]
jg@@
3
movax,
1
@@
3:
ret
ENDP
;
END

上面的文件中使用的插入文件tasm_c.inc和编译文件在《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》中,鼠标函数也可由C++(Trubo C++或者Borland C++)直接调用。如果有人喜欢OO,正好我发现还有个C++的鼠标汇编文件,一并贴在下面供参考,不过其中的函数都是static的:

//mouse.hpp

#ifndef__MOUSE_HPP
#define__MOUSE_HPP

constint
//定义鼠标按钮状态常量
MO_LEFT_PRESS=-256,//左边按钮按下
MO_RIGHT_PRESS=-257,//右边按钮按下
MO_LEFT_REL=-258,//左边按钮放开
MO_RIGHT_REL=-259,//右边按钮放开
MO_LEFT_DOUBLE=-260,//左边按钮双击
MO_RIGHT_DOUBLE=-261,//右边按钮双击
MO_STATE=-262;//鼠标拖动

classMouse
{

public:

//初始化,如鼠标存在,返回1,否则返回0
staticintInit(void);
//置鼠标位置到X,Y
staticvoidSetXY(intx,inty);
//返回鼠光标当前的位置
staticvoidGetXY(int&x,int&y);
//返回鼠标驱动程序安装状态,1已安装,0未安装
staticintDriveFlag();
//打开鼠光标
staticvoidShow(void);
//关闭鼠光标
staticvoidHide(void);
//如鼠光标在坐标(x1,y1)-(x2,y2)内返回1,否则返回0
staticintInBox(intx1,inty1,intx2,inty2);
//如鼠光标在文本坐标(Row1,Col1)-(Row2,Col2)内返回1,否则返回0
staticintInTextBox(intRow1,intCol1,intRow2,intCol2);
//设置鼠光标类型,X,Y为光标热点,Pattern为光标点阵地址
staticvoidSetCursor(intX,intY,voidfar*Pattern);
//返回鼠标按钮状态,如鼠标不存在或未动作,返回0,否则返回状态值(见状态常量)
staticintGetMouse();

};

#endif

下面是鼠标功能C++函数汇编码文件,其中可以看到C++函数名称管理的方式,这个文件没包括在《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》的MAKEFILE中,必须单独编译:

;mouse.asm

includetasm_c.inc

MO_LEFT_PRESSequ
-256
MO_RIGHT_PRESSequ
-257
MO_LEFT_RELequ
-258
MO_RIGHT_RELequ
-259
MO_LEFT_DOUBLEequ
-260
MO_RIGHT_DOUBLEequ
-261
MO_STATEequ
-262

PUBLIC@Mouse@Init$qv
PUBLIC@Mouse@SetXY$qii
PUBLIC@Mouse@Show$qv
PUBLIC@Mouse@Hide$qv
PUBLIC@Mouse@InBox$qiiii
PUBLIC@Mouse@InTextBox$qiiii
PUBLIC@Mouse@SetCursor$qiinv
PUBLIC@Mouse@GetMouse$qv
PUBLIC@Mouse@DriveFlag$qv
IFLDATA
PUBLIC@Mouse@GetXY$qmit1
ELSE
PUBLIC@Mouse@GetXY$qrit1
ENDIF

DATASEG

MouseFlagdw
0
MouseCurFlagdw
0
MouseTimedd
0

CODESEG

PROC@Mouse@Init$qv

movax,[wordMouseFlag]
orax,ax
jnz@@
1
int33h
orax,ax
jz@@
1
xorcx,cx
xordx,dx
movax,
4
int33h
movax,
1
mov[MouseFlag],ax
@@
1:
ret
ENDP

PROC@Mouse@SetXY$qii

ARGx:word,y:word

cmp[wordMouseFlag],
0
je@@
1
movcx,[x]
movdx,[y]
movax,
4
int33h
@@
1:
ret
ENDP

PROC@Mouse@Show$qv

cmp[wordMouseFlag],
0
je@@
1
cmp[wordMouseCurFlag],
0
jne@@
1
movax,
1
int33h
mov[wordMouseCurFlag],
1
@@
1:
ret
ENDP

PROC@Mouse@Hide$qv

cmp[wordMouseFlag],
0
je@@
1
cmp[wordMouseCurFlag],
0
je@@
1
movax,
2
int33h
mov[wordMouseCurFlag],
0
@@
1:
ret
ENDP

PROC@Mouse@SetCursor$qiinv

ARGx:word,y:word,prttern:farptr
cmp[wordMouseFlag],
0
je@@
1
movax,
9
movbx,[x]
movcx,[y]
lesdx,[dwordprttern]
int33h
@@
1:
ret
ENDP

PROC@Mouse@InBox$qiiii

ARGx1:word,y1:word,x2:word,y2:word

cmp[wordMouseFlag],
0
jz@@
3
movax,
3
int33h
movax,[x2]
movbx,[x1]
cmpbx,ax
jle@@
1
xchgbx,ax
@@
1:
cmpbx,cx
jg@@
3
cmpax,cx
jl@@
3
movax,[y2]
movbx,[y1]
cmpbx,ax
jle@@
2
xchgbx,ax
@@
2:
cmpbx,dx
jg@@
3
cmpax,dx
jl@@
3
movax,
1
jmp
short@@4
@@
3:
xorax,ax
@@
4:
ret
ENDP

PROC@Mouse@InTextBox$qiiii

ARGRow1:word,Col1:word,Row2:word,Col2:word

cmp[MouseFlag],
0
jz@@
3
movax,
3
int33h
movbx,cx
movax,[Row2]
cmpax,[Row1]
jge@@
1
xchgax,[Row1]
@@
1:
movcl,
3
shlax,cl
addax,
7
cmpax,dx
jl@@
3
movax,[Row1]
shlax,cl
cmpax,dx
jg@@
3
movax,[Col2]
cmpax,[Col1]
jge@@
2
xchgax,[Col1]
@@
2:
shlax,cl
addax,
7
cmpax,bx
jl@@
3
movax,[Col1]
shlax,cl
cmpax,bx
jg@@
3
movax,
1
jmp
short@@4
@@
3:
xorax,ax
@@
4:
ret
ENDP

IFLDATA

PROC@Mouse@GetXY$qmit1

ELSE

PROC@Mouse@GetXY$qrit1

ENDIF

ARGx:DPTR_,y:DPTR_
movax,
3
int33h
LES_bx,[x]
mov[ES_bx],cx
LES_bx,[y]
mov[ES_bx],dx
ret
ENDP

PROC@Mouse@DriveFlag$qv

movax,[MouseFlag]
ret
ENDP

PROC@Mouse@GetMouse$qv

movax,[MouseFlag]
orax,ax
jz@@
5
xorbx,bx
movax,
5
int33h
movax,MO_LEFT_PRESS
orbx,bx
jnz@@
3
movbx,
1
movax,
5
int33h
movax,MO_RIGHT_PRESS
orbx,bx
jnz@@
3
xorbx,bx
movax,
6
int33h
orbx,bx
jz@@
1
movax,MO_LEFT_REL
jmp
short@@5
@@
1:
movbx,
1
movax,
6
int33h
jz@@
2
movax,MO_RIGHT_REL
jmp
short@@5
@@
2:
movax,
3
int33h
xorax,ax
testbx,
3
jz@@
5
movax,MO_STATE
jmp
short@@5
@@
3:
pushax
movah,2ch
int21h
popax
subdx,[wordMouseTime]
sbbcx,[wordMouseTime
+2]
orcx,cx
jnz@@
4
cmpdx,
30
jg@@
4
subax,
4
mov[wordMouseTime],cx
mov[wordMouseTime
+2],cx
jmp
short@@5
@@
4:
add[wordMouseTime],dx
adc[wordMouseTime
+2],cx
@@
5:
ret
ENDP
;
END

下一篇给出一个XMS内存管理文件代码。

再次声明,这几篇文章的代码是1995年前的东西,用现在的眼光去看它们,还不知道是不是C函数,只能供初学者们借鉴参考。至于是否有错误,我就不得而知了,不过,我以前使用时,没出过什么问题。有错误或建议,请来信:maozefa@hotmail.com

分享到:
评论

相关推荐

    Turbo C2.0

    使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。   基本配置要求  Turbo C 2.0可运行于...

    Turbo C2.0库函数源程序与参考大全

    整理编译了Turbo C 2.0运行库中的所有函数以及详细的函数使用说明,其中包含了底层支持函数和汇编语言结合。内容比较晦涩,但是是你进阶C高手的绝世好剑……

    编程语言函数指令字典大全(包括汇编语言、TurboC、C++、VFP6.0、VB6.0)

    集成了多种语言查询的“指令字典2005” 增加了新的功能,新的...还对原有语言进行了全面扩充与完善(例如:C、C++的函数增加到了350多个, 开放了文件修改功能等等)还有很多扩充完善这里就不多做介绍了,快来下载吧 "_

    VC++与汇编语言的混合编程

    掌握嵌入汇编函数和汇编语言子程序与VC++的混合编程方法,入口、出口参数的传递方法以及在VC++环境下混合编程的调试方法。 二、 实验条件 硬件:计算机一台 软件:Visual Studio C++ 6.0、MASM 6.0 三、 实验原理...

    Turbo C实用高级编程技巧

    第一部分为c语言的基础知识和turbo c的屏幕函数及绘图函数,第二部分介绍turbo c的一些实用编程技巧,包括西文操作系统下显示汉字技术、与foxBASE接口技术、turbo c的高级打印技术、菜单设计技术与汇编语言的接口...

    [80X86汇编语言程序设计].王元珍.文字版

    7.4 调试程序Turbo Debugger的使用 7.4.1 TD的启动和退出 7.4.2 利用TD调试汇编语言程序 7.4.3 调试举例 附录 附录Ⅰ ASCII码字符表 附录Ⅱ 80X86指令系统简表 附录Ⅲ 伪指令表 附录Ⅳ DOS的软中断与系统...

    兼容TurboPascal以及FreePascal的简易下拉菜单程序

    原来的程序支持鼠标操作、dos下环境操作、内存操作、汇编(asm)函数或过程、dos下的汉字系统等。由于freepascal对这些特性中的大部分不能很好地支持,所以本次对这些特性全部删除。精简后的系统同时支持TurboPascal...

    8086/8088汇编语言程序设计教程

    8.5 编写供Turbo C调用的函数 8.5.1 汇编格式的编译结果 8.5.2 汇编模块应该遵守的约定 8.5.3 参数传递和寄存器保护 8.5.4 举例 8.6 习题 第二部分 提高部分 第9章 80386程序设计基础 9.1 80386寄存器 9.1.1 通用...

    汇编语言程序设计 第二版

    第十二章 汇编语言和C语言的混合编程 12.1 汇编指令的嵌入 12.2 C语言源程序的汇编输出 习题 第十三章 Windows应用程序的编程 13.1 消息框 13.2 编程伪指令 13.2.1 多路分支语句 13.2.2 调试语句 13.3 Windows程序的...

    80X86汇编语言程序设计

    8.5 编写供Turbo C调用的函数 8.5.1 汇编格式的编译结果 8.5.2 汇编模块应该遵守的约定 8.5.3 参数传递和寄存器保护 8.5.4 举例 8.6 习题 第二部分 提高部分 第9章 80386程序设计基础 9.1 80386寄存器 9.1.1 通用...

    (谭浩强)c语言学习书

    由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用,成为当代最优秀的程序设计语言之一。 1.3 C语言版本 目前最...

    80x86汇编语言程序设计教程

    8.5 编写供Turbo C调用的函数 8.5.1 汇编格式的编译结果 8.5.2 汇编模块应该遵守的约定 8.5.3 参数传递和寄存器保护 8.5.4 举例 8.6 习题 第二部分 提高部分 第9章 80386程序设计基础 9.1 80386寄存器 9.1.1 通用...

    C语言讲解 主讲:邓君峰

    C语言特点 语言特点 C程序结构 程序结构 基本的输入输出 程序设计语言的发展机器语言 汇编语言 高级语言 – 通用语言 fortran, basic C VB SQL Delphi Powerbuild C++ ( VC++ BC++ ) – 数据库语言 foxbase ,FoxPro ...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    Turbo-Histogram:最快的直方图构建

    最快的直方图构建 每字节约 1.2 个时钟100% C(与 C++ 兼容),无内联汇编支持 32 位和 64 位便携式标量函数比 SIMD 函数更快比简单的解决方案快3 倍以上 :NEW_button: 更快,甚至超过其他快速汇编函数基准: 单线程...

    你必须知道的495个C语言问题

    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数...

Global site tag (gtag.js) - Google Analytics