/*
由于显存有1~64M内存(甚至更多),它是通过页框映射到显存(1~64M)中,
一般情况下,首地址在A000:0000中,页框大小为64K字节。
注意:记住任何时候显存只占用系统内存的A000:0000 ~ A000:FFFF或者
B000:0000 ~ B000:FFFF,通过换页来映射到显存中。
页框大小一般为64K字节,也有的显卡是128K字节的页,但很少见。
*/
/*
请在Win98或纯DOS下运行!在Win2000或WinXP下有可能执行不成功!
*/
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
/*显示模式上640*480*265色*/
BOOL SetVESA_640_480_256()
{
int nResult, nMode;
nResult = 0;
nMode = 0x101;
asm mov ax, 04F02H
asm mov bx, nMode
asm int 10h
asm mov nResult,ax
return((nResult == 0x4F)?TRUE:FALSE);
}
/*换页函数,64K为一个显示页,页框在内存A000:0000处*/
void ChangeFrame(int nPage)
{
asm push cx
asm mov ax,04F05H
asm mov bx,0
asm mov dx,nPage
asm int 10h
asm pop cx
return;
}
/*填充整个屏幕*/
void FillScreen(int nColor)
{
/*计算总页数和不足页的字节数,256色下,一个点对应一个字节*/
WORD i;
WORD uPages, uOffset;
BYTE far * pFrame;
uPages = (unsigned)((640L * 480L) / (1L<<16));
uOffset= (unsigned)((640L * 480L) % (1L<<16));
pFrame = (BYTE far *)MK_FP(0xA000, 0000);
for (i = 0; i < uPages; i++)
{
/*切换到第 i 页*/
ChangeFrame(i);
/*将A000:0000 ~ A000:FFFF的64K字节都填充为nColor的颜色*/
_fmemset(pFrame + 0u * 0x8000u, nColor, 0x8000u);
_fmemset(pFrame + 1u * 0x8000u, nColor, 0x8000u);
}
if (uOffset != 0u)
{
/*切换到最后一页*/
ChangeFrame(uPages);
_fmemset(pFrame, nColor, uOffset);
}
}
int main()
{
/*上640*480*256色*/
SetVESA_640_480_256();
/*填充整个屏幕为绿色*/
FillScreen(GREEN);
getch();
/*填充整个屏幕为蓝色*/
FillScreen(BLUE);
getch();
/*填充整个屏幕为红色*/
FillScreen(RED);
getch();
/*填充整个屏幕为淡蓝色*/
FillScreen(LIGHTBLUE);
getch();
/*恢复到文本模式*/
asm mov ax, 3
asm int 10h
return(0);
}