1、附录B INT10中断号视频服务程序00H(设置视频模式)输入: AH=00H AL=视频模式输出: 无 说明:视频服务程序00H用来设置视频配置为表10-l中列出之一。AL寄存器给定所需视频模式。若设置了新视频模式,则清除屏幕。 视频服务程序0lH(设置光标大小)输入: AH=01H CH=光标开始扫描行 CL=光标结束扫描行输出: 无说明:该服务程序用于正文模式。在一个字符单元内由一行或几行组成的光标将在字符显示位置得闪烁。该服务程序定义光标的显示行数。对CGA模式,8扫描行(07)用于光标。对EGA模式,使用14行(013)。MCGA和VGA适配器,光标可具有16扫描行(015)高。缺省
2、设置如下: CGA: CH6,CL7 EGA: CHll,CL12 MCGA和VGA: CH量13,CL1 视频服务程序02H(设置光标位置)输入: AH=02H BH=光标页号 DH=光标行号 DL=光标列号输出: 无说明:该服务器序用于将光标移到指定行和列位置。该服务程序即可用于正文模式也可用于图形模式;然而,仅在正文模式下才显示光标。屏幕左上角为坐标系统的原点。对支持多页的正文和图形模式,则必须指定页号,以保证光标位置正确。视频服务程序03H(读光标位置)输入: AH=03H BH=页号输出: CH=光标开始行 CL=光标结束行 DH=行号 DL列号说明:该服务程序用于获取光标大小和位置
3、。BH给定了页号。CH中存放光标开始扫描行,而CL中为光标结束扫描行。DH中存放行位置,DL中为列位置。视频服务程序05H(设置活动显示页)输入: AH=05H AL=活动页号输出: 无 说明:该服务程序为正文和图形模式用来设置活动显示页号。AL指定所需页号。对多数正文模式,页号范围为0一7。对具有足够视频缓冲EGA和VGA适配器,可支持多页图形。对所有正文和图形模式,缺省为0页。视频服务程序06H(向上翻滚活动窗口)。输入:AH=06HAL=翻滚行数BH=空白行属性CH左上角行号CL=左上角列号 DH右下角行号 Dl右下角列号输出: 无 说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中
4、给出了正文窗口左上角坐标,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL00H,则正文窗口为空白。当滚动窗口时,底部行是空白行,其属性由BH中指定。视频服务程序07H(向下翻滚窗口)输入:AH=07HAL=翻滚行数BH=空白行属性CH=左上角行号CL=左上角列号DH=右下角行号DL=右下角列号输出: 无说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL00H,则正文窗口为空白。当滚动窗口时,顶部行为空白,其属性由BH中指定。视频服务程序08H(读字符和属性)输入: AH=08
5、H BH=活动页号输出: AH=字符属性 AL=字符码说明:该服务程序用于读取正文或视频模式下,光标所在处字符。在图形模式下,获取的字符同图形模式下使用的字符生成表有关。在正文模式下,将获得字符的ASCII码。字符属性存放在AH中,字符ASCII码存放在AL中。图形模式下,AH中内容无意义.视频服务程序09H(写字符和属性)输入: AH09H AL=写字符的ASCII码 BL=写字符的属性 BH=活动页号 CX=重复写字符和属性次数输出: 无 说明:该服务程序写一个字符到屏幕当前光标处。AL中指定字符码。正文模式下,BL中指定字符属性。图形模式下,BL指定背景颜色。字符可重复写。CX为写字符及
6、属性的次数。视频服务程序0FH(取当前视频模式)输入: AH0FH输出: AH每行字符数 AL当前显示模式 BH活动页号说明:该服务程序用来获取当前视频模式,屏幕宽(以字符计),以及活动显示页号;视频显示模式存放在AL中。屏幕宽度(以字符计)存放在AH中,活动页号存放在BH中。文件相关函数函数名: fopen功 能: 打开一个流用 法: FILE *fopen(char *filename, char *type);函数名: fclose功 能: 关闭一个流用 法: int fclose(FILE *stream); fopen()函数提供了几种打开文件的方式,这是由其字符指针参数type决定
7、的。以下给出打开方式列表:参数作用R只读W新建、可写,如果文件存在则覆盖A存在则在文件后附加,如果不存在则新建后写r+更新一个存在的文件(读和写)w+增加一个新的文件更新(读和写),如果文件存在则覆盖a+存在则在文件后附加(读和写),如果不存在则新建后更新(读和写)*以文本模式打开一个存在或新建的文件,附加”t”在参数后(rt, w+t, etc.)。*以二进制模式打开一个存在或者新建的文件,附加”b”在参数后(wb, a+b, etc.)。函数名: fseek功 能: 重定位流上的文件指针用 法: int fseek(FILE *stream,long offset,int fromwher
8、e); 读取文件函数:函数名: fread功 能: 从一个流中读数据用 法: int fread( void *ptr, int size, int nitems, FILE *stream ); 写入文件函数:函数名: fwrite功 能: 写内容到流中用 法: int fwrite( void *ptr, int size, int nitems, FILE *stream ); fseek()函数提供了文件指针的三个初始位置,这是由其参数fromwhere决定的,以下给出其列表:常量值文件定位SEEK_SET0从文件头开始寻找SEEK_CUR1从文件当前位置开始寻找SEEK_END2从文
9、件最后开始寻找函数名: fprintf功 能: 传送格式化输出到一个流中用 法: int fprintf( FILE *stream, char *format, argument,. );函数名: fscanf功 能: 从一个流中执行格式化输入用 法: int fscanf( FILE *stream, char *format,argument. );发声函数函数名: sound功 能: 以指定频率打开PC扬声器用 法: void sound(unsigned frequency);函数名: nosound功 能: 关闭PC扬声器用 法: void nosound(void);常规内存操作
10、函数申请函数:malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()函数名: malloc功 能: 内存分配函数用 法: void *malloc(unsigned size);函数名: farmalloc功 能: 从远堆中分配存储块用 法: void far *farmalloc(unsigned long size);函数名: calloc功 能: 分配主存储器用 法: void *calloc(size_t nelem, size_t elsize);函数名: farcalloc功 能: 从远堆栈中申请空间用 法:
11、void far *farcalloc( unsigned long units, unsigned ling unitsz );函数名: realloc功 能: 重新分配主存用 法: void *realloc(void *ptr, unsigned newsize);函数名: farrealloc功 能: 调整远堆中的分配块用 法: void far *farrealloc( void far *block, unsigned long newsize );使用函数:memcpy(),memset(),memmove(),movedata()函数名: memcpy功 能: 从源source
12、中拷贝n个字节到目标destin中用 法: void *memcpy(void *destin,void *source,unsigned n);函数名: memset功 能: 设置s中的所有字节为ch, s数组的大小由n给定用 法: void *memset(void *s, char ch, unsigned n);函数名: memmove功 能: 移动一块字节用 法: void *memmove(void *destin,void *source,unsigned n);函数名: movedata功 能: 拷贝字节用 法: void movedata(int segsrc, int of
13、fsrc, int segdest, int offdest, unsigned numbytes);释放函数:free(),farfree()函数名: free功 能: 释放已分配的块用 法: void free(void *ptr);函数名: farfree功 能: 从远堆中释放一块用 法: void farfree(void);指针操作函数:MK_FP(),FP_OFF(),FP_SEG()函数名: MK_FP功 能: 设置一个远指针用 法: void far *MK_FP(unsigned seg, unsigned off);函数名: FP_OFF功 能: 获取远地址偏移量用 法:
14、unsigned FP_OFF(void far *farptr);函数名: FP_SEG功 能: 获取远地址段值用 法: unsigned FP_SEG(void far *farptr);如果想知道还剩下多少常规内存,我们可以使用以下函数:函数名: coreleft()功 能: 获取空闲内存用 法: unsigned coreleft(void);函数名: farcoreleft()功 能: 获取远堆空闲内存用 法: unsigned long farcoreleft(void);XMS功能调用索引表:功能号功能版本功能00H功能01H功能02H功能03H功能04H功能05H功能06H功能
15、07H功能08H功能09H功能0AH功能0BH功能0CH功能0DH功能0EH功能0FH功能10H功能11H取XMS版本号请求高内存区HMA释放高内存区HMA全程启用A20全程停用A20局部启用A20局部停用A20查询A20状态查询自由扩展内存分配扩展内存块释放扩展内存块移动扩展内存块锁住扩展内存块扩展内存块解锁取EMB句柄信息重新分配扩展内存块请求上位存储块UMB释放上位存储块UMBXMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.
16、0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS规范V2.0XMS功能调用函数1. 测试xms是否存在使用中断2fH的43H(AH)功能的00H(AL)子功能,可以获得是否安装了XMS驱动程序的信息,如果AL返回为80H则说明XMS安装了。以下给出具体函数:char test_xms() asm mov ax,0x4300int 0x2f if (_AL=0x80) XMS=1; return(XMS);2. 获取xms驱动程序入口地址使用中断2fH的43H(AH)功能的10H(AL)子功能,可以获得xms驱动程序入口地址,返回的ES:BX便是
17、具体的入口。以下给出具体函数:void get_driver_address() if (XMS) asm mov ax,0x4310 /功能号43H int 0x2f /调用中断2fH xms=(void (far *)()(long)(_ES)lock_count=_BH; handle_info-free_handle=_BL; /获取可用的句柄handle_info-size=_DX; /获取句柄分配的块的容量 return(error_code); 18. 为句柄重新分配内存使用功能0FH(AH)可以为句柄重新分配内存,DX给入句柄,BX给入新的块的容量(单位:K),AX返回0001
18、H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char reallocate_xms_block(unsigned handle,unsigned size) char error_code=0xff; if (XMS) asm mov ah,0x0f mov dx,handle mov bx,size xms();error_code=_BL; return(error_code); 19. 请求分配UMB使用功能10H(AH)可以请求分配UMB(upper memory block,即上位内存, 640K以上的非EMS内存),DX给入块的大小(单位:节, 即pa
19、ragraphs, 为16个字节),AX返回0001H表示成功、0000H表示失败,BX返回分配UMB的段地址,DX返回块的实际容量actual size of block,失败时BL返回错误代码,以下给出具体函数:typedef struct UMB_info unsigned UMB_segment; unsigned size; ui;char request_UMB(unsigned size,ui *info) char error_code=0xff; if (XMS) asm mov ah,0x10 mov dx,size xms();error_code=_BL;info-UM
20、B_segment=_BX;/返回umb段地址info-size=_DX;/返回容量 return(error_code); 20. 释放UMB使用功能11H(AH)可以释放UMB(upper memory block),640K以上的非EMS内存),DX给入要释放的UMB内存的段地址,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char release_UMB(unsigned segment) char error_code=0xff; if (XMS) asm mov ah,0x10 mov dx,segment xms();error_co
21、de=_BL; return(error_code); 这里值得一提的是HIMEM.SYS需要至少为256字节的栈空间。此外给出错误时BL返回的错误代码及其含义:返回错误代码含义80h没有提供的功能81h检测到虚拟盘(Vdisk)82h发生A20地址线错误8Eh一般驱动程序错误8Fh致命的驱动程序错误90h高端内存(HMA)不存在91h高端内存(HMA)已被使用92hDX is less than the /HMAMIN= parameter93h高端内存(HMA)未被分配94hA20地址线已被激活A0h所有扩充内存已被分配A1h所有可用的句柄已被分配A2h无效的句柄A3h无效的源句柄A4h无
22、效的源偏移A5h无效的目的句柄A6h无效的目的偏移A7h无效的长度A8h移动有非法的重叠A9h发生奇偶校验错误AAh块未加锁ABh块已被锁定ACh块锁定计数溢出ADh锁定失败B0h只有更小一些的UMB空间B1h没有可用的UMB空间EMS功能调用索引EMS功能调用索引:功能号功能功能40H功能41H功能42H功能43H功能44H功能45H功能46H功能47H功能48H功能4BH功能4CH功能4DH取得EMS程序状态取得物理映射页面的段地址获取逻辑页页数信息分配句柄和内存内存映射释放句柄和内存获取EMM的版本号保存指定句柄映射关系恢复指定句柄映射关系获取EMM的句柄数获取指定句柄所分配的逻辑页页数
23、获取所有句柄分配情况1. 测试EMS管理程序测试EMS管理程序, 找到返回1, 否则返回0,以下给出具体函数:char test_ems() int i; union REGS inregs,outregs; struct SREGS segs; struct DeviceHeader struct DeviceHeader far *link;unsigned attributes;unsigned strategy_offset;unsigned interrupt_offset;char name_of_number_of_units8; far *dev; unsigned char
24、major,minor,c13; inregs.x.ax=0x3001;/dos中断功能30子功能01读取当前扩充内存是否有效 intdos(&inregs,&outregs);/DOS中断 major=outregs.h.al;/返回扩充内存状态 minor=outregs.h.ah; if (majorattributes & 0x8000) for (i=0;iname_of_number_of_unitsi; /取设备名称 if (!strcmp(c,EMMXXXX0) /将设备名称与扩充内存名字比较 EMS=1;/扩充内存存在 return(1); dev=dev-link; /指向
25、下一个设备 return(0); 2. 取得管理程序状态在确认EMS存在时,使用中断67H功能40H(AH)可以取得管理程序状态,AH返回00H表示成功、否则返回错误代码。以下给出具体函数:char get_EMS_status() char tmp=0xff; if (EMS) asm mov ah,0x40/功能号40h int 0x67/调用中断67h mov tmp,ah/返回值 return(tmp); 3. 取得物理映射页面的段地址使用中断67H功能41H(AH)可以取得物理映射页面的段地址,AH返回00H表示成功、否则返回错误代码,BX返回物理映射页面的段地址。使用此功能可确定E
26、MS在1Mb常规内存中的映射位置,此物理映射页面的大小为64K, 分为0-3页, 每页为16K,因为EMS逻辑页的大小为16K, 也就是说我们最多可同时将4 个EMS逻辑页映射到物理页上。以下给出具体函数:char get_page_frame_segment(unsigned *segment) char tmp=0xff; if (EMS) asm mov ah,0x41 int 0x67 mov tmp,ah*segment=_BX;/取得段地址 return(tmp); 4. 获取逻辑页页数信息使用中断67H功能42H(AH)可以获取逻辑页页数信息,AH返回00H表示成功、否则返回错误
27、代码,BX返回未分配的页数,DX返回页的总数。以下给出具体函数:char get_number_of_pages(unsigned *avail,unsigned *total) char tmp=0xff; if (EMS) asm mov ah,0x42 int 0x67 mov tmp,ah *avail=_BX;/返回可用页数*total=_DX;/返回所有页数 return(tmp); 5. 分配句柄和内存使用中断67H功能43H(AH)可以分配句柄和内存,BX给入要求分配的逻辑页的页数(逻辑页每页的大小为16K),AH返回00H表示成功、否则返回错误代码,DX返回句柄。当程序退出运行时, 句柄将被非显式的关闭并无法回收。以下给出具体函数:char allocate_memory(unsigned *handle,unsigned page_numbers) char tmp=0xff; if (EMS) asm mov ah,0x43 mov bx,page_numbers int 0x67 mov tmp,ah*handle=_DX;/返回句柄 return(tmp); 6. 内存映射使用中断67H功能44H(AH)可以进行内存映射,AL给入物理页页号 (0-3),BX给入要求分配的逻辑页的页数(逻辑页每页的大小为16K),DX给入句柄,AH返回00H表
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100