游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1962|回复: 4

【求助】c语言下调用10

[复制链接]

3

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2005-7-3 23:23:00 | 显示全部楼层 |阅读模式
小弟今天看到下面的程序,功能是调用10H中断在屏幕上描绘一个点

#define VGA256 0x13
#define TEXT_MODE 0x03
#include<dos.h>
#include<conio.h>

unsigned char far *video_buffer=(char far *)0xA0000000L;

void Set_Video_Mode(int mode)
{
    union REGS inregs,outregs;
    inregs.h.ah=0;
    inregs.h.al=(unsigned char)mode;
    int86(0x10,&inregs,&outregs);
}

void main(void)
{
    int x,y,color;
    Set_Video_Mode(VGA256);
    x=100;
    y=100;
    color=WHITE;
    video_buffer[((y<<8)+(y<<6))+x]=color;
    /*(y<<8)+(y<<6)暨第一步
    //((y<<8)+(y<<6))+x为第二步
    //video_buffer[((y<<8)+(y<<6))+x]为第三步
    //video_buffer[((y<<8)+(y<<6))+x]=color和color=0为第四步*/
    getch();
    Set_Video_Mode(TEXT_MODE);

}

有几处不明白的地方:
1.unsigned char far中的far是个什么关键字,起什么作用?
2.0xA0000000L是个什么地址?
3.video_buffer[((y<<8)+(y<<6))+x]是怎么回事?
望各位指教,谢谢!!!

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2005-7-4 10:23:00 | 显示全部楼层

Re:【求助】c语言下调用10

1。far代表长指针,这是非保护模式下的遗留
2。0XA000000L代表vga缓冲区的首地址,这个缓冲区和屏幕上的像素是对应的
3。(y<<8 + y << 6 ) 这个相当于 y * 256 + y * 64 = y * 320
那么y * 320 + x,就是用来在当前设置的屏幕分辨率下(320X240)来定位屏幕上,也就是上述缓冲区内的一个点,因为在遥远遥远的过去,移位法要比乘法来的快

9

主题

106

帖子

106

积分

注册会员

Rank: 2

积分
106
QQ
发表于 2005-7-4 11:33:00 | 显示全部楼层

Re:【求助】c语言下调用10

  现在也还是位移快过算术指令……

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-7-4 11:37:00 | 显示全部楼层

Re:【求助】c语言下调用10

现在怎么还会有人int 10啊?

24

主题

104

帖子

104

积分

注册会员

Rank: 2

积分
104
发表于 2005-7-4 15:44:00 | 显示全部楼层

Re:【求助】c语言下调用10

好像是那个Bios中断吧??
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 06:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表