#include<conio.h>
#include<stdio.h>
#include<string.h>
#include <dos.h>
#include <stdlib.h>
#define VBE800X600X256 0X103
unsigned short g_cur_vbe_page=0;
/////////////////////////////////////////////////////////////////////////////////////////////////
//显存换页函数 引用neo函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX = 0;
_DX = g_cur_vbe_page = page;
_AX = 0x4F05;
__int__(0x10);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//初始化屏幕为800X600X256
/////////////////////////////////////////////////////////////////////////////////////////////////
void GuiInitGraph(void)
{
_AX = 0x4F02;
_BX = VBE800X600X256;
__int__(0x10);
if(_AH != 0)
{
puts("Can't Initialize the graphics mode!");
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//关闭图形模式函数
/////////////////////////////////////////////////////////////////////////////////////////////////
void GuiCloseGraph(void)
{
_AX = 0x4F02;
_BX = 0x03;
__int__(0x10);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
// 由于分辨率为800*600*256色(8位深度),因此共需800*600/65535=8页=512K
/////////////////////////////////////////////////////////////////////////////////////////////////
void ReDraw()
{
unsigned int i,j;
unsigned char VDCBuf[800];//缓冲区
unsigned int dest_seg = 0xa000;//显存首址
unsigned int dest_off = 0;
for (j = 0 ; j < 8 ; j++) // 页号(共需8页)
{
for (i=0;i<800;i++)
VDCBuf[i] = 4; // 将整屏显示红色
set_vbe_page(j); // 依次选择页号0-页号7
dest_off = 0; // 偏移
/* 由于每页65535,因此先送64800个像素*/
for (i=0;i<81;i++)
{
movedata(FP_SEG(VDCBuf), // 缓冲区段址
FP_OFF(VDCBuf), // 缓冲区偏移
dest_seg, // 显存段址
dest_off, // 显存偏移
800); // 每次送一根扫描线
dest_off += 800; // 指向下一根扫描线
}
/* 将每页余下的735个像素单独送*/
movedata(FP_SEG(VDCBuf), // 缓冲区段址
FP_OFF(VDCBuf), // 缓冲区偏移
dest_seg, // 显存段址
dest_off, // 显存偏移
735); // 每次送一根扫描线
}
}
void main()
{
GuiInitGraph();
ReDraw();
getch();
getch();
GuiCloseGraph();
}
/*
800*600*256色将整屏清除 程序思路如下:
FOR 页号 = 0 TO 7
FOR 扫描线 = 0 TO 81
循环 每次先送每页前64800个像素
END FOR
送当前页剩下的735个像素
END FOR
*/
上述思路对吗?