登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

杨伟的博客

程序人生

 
 
 
 
 

日志

 
 

TC / BC 下直接写显存 (直接写屏) 的技术  

2011-06-11 00:32:00|  分类: IT界 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

先说一下,这个技术已经淘汰了,没人用了,除非你必须用 TC,否则不学也罢。TC / BC 泛指 Turbo C 2.0、Turbo C 3.0 和 Borland C 3.1,他们都是 dos 时代的编程工具,用的都是 Borland 公司的 BGI 绘图库。

另外就是,我只是简单介绍一下,想要完全看明白得参考很多上个世纪的书,我就不过多的详细描述了,能看懂多少算多少吧。

我只拿 VGA / VGAHI 这个模式来举例子。

在 dos 下,常规内存只有 640k,显存映射于 640k 以外的 0A0000H~0AFFFFH (只有 64k),在这个地址内写数据,可以直接在屏幕上显示出来。

VGAHI 是 640 x 480 @ 16 色,占 4 个位面,共需内存 256k,需要指定 0A0000H~0AFFFFH 映射哪个(些)位面。通过端口 0x3c4 / 0x3c5 设置位面。代码如下:
outportb(0x3c4, 2);
outportb(0x3c5, 位面);

其中,“位面”的低 4 位,由低到高分别表示蓝、绿、红、加亮。例如,想画加亮的蓝色,可以设置位面为 9:
outportb(0x3c4, 2);
outportb(0x3c5, 9);

选择好位面后,直接向 0xA0000 写入数据,即可将数据写入到显存的指定位面上。每个字节有 8 位,因此写入一个字节可以控制 8 个点。

以下是个完整的例子,实现在 (0, 0) 的位置画一个红点,在 (0, 1)-(7, 1) 的位置画 8 个黄点:

// 程序名称:直接操作显存的范例程序
// 编译环境:Borland C++ 3.1
//
#include <graphics.h>
#include <conio.h>

void main()
{
    // 初始化图形模式为 640 x 480 @ 16
    int gd=VGA, gm=VGAHI;
    initgraph(&gd, &gm, "c:\\borlandc\\bgi");

    // 设置显存指针
    unsigned char far *v = (char far *)0xA0000000L;

    outportb(0x3c4, 2);
    outportb(0x3c5, 4); // 启用红色位面
    v[0] = 0x80;  // 画 1 个点

    outportb(0x3c5, 0xe); // 启用绿色、红色、加亮三个位面
    v[80] = 0xff;  // 画 8 个点

    // 按任意键退出
    getch();
    closegraph();
}

最后,我还是得说一句:时代不同了,真的,学这些真的一点用都没有。与其用这些繁琐的东西实现 TC 下的特殊效果,不如看看 EasyX 吧。

  评论这张
 
阅读(117)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018