#include<dos.h>
#include<math.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>#define X_RES 800
#define Y_RES 600
typedef unsigned char byte;
typedef unsigned short word;
char far *scr = (char far *)MK_FP(0xA000, 0); //pointer to the satrt of VESA
//memory screen
unsigned long lYTable; //table of already calculated adresses
short currentBank;
void SetBank(unsigned short iBank)
{
asm {
mov ax, 0x4F05
xor bx, bx
//shl iBanks,1 <--my first change
mov dx, iBank
int 0x10
};
}
void Initialize(short a)
{
short y;
asm{
mov ax, 0x4f02
mov bx, a
int 0x10
}
currentBank^=currentBank;
SetBank(currentBank);
for (y = 0; y < Y_RES; y++)
YTable = (unsigned long )y * X_RES;
}
void SetPixel(unsigned int x, unsigned int y, unsigned int c)
{
unsigned int iSegment;
unsigned int iOffset;
unsigned long lAddress;
lAddress = lYTable + x; //get adress from calculated table
iSegment = lAddress >> 16; //get higher bits of adress to calc the segment
iOffset = lAddress & 0x0000FFFF; //get lower bits of adress to calculate the offset
if(iSegment != currentBank)
{
currentBank = iSegment;
SetBank(iSegment); //set the bank at the calculated segment
}
//set SetBank(iSegment*2) <--- my second change
//(I also got out the if statement and currentBank = iSegment)
scr = c; //set the color on the memory
}
void SetRGB(short c, short r,short g,short b)
{
outp(0x3C8, c);
outp(0x3C9, r);
outp(0x3C9, g);
outp(0x3C9, b);
}
void CloseVesa()
{
asm {
mov ax, 0x4f02
mov bx, 0x108
int 0x10
}
}
void main()
{
int i,j;
Initialize(0x114);
for(j=0;j<Y_RES;j++)
for(i=0;i<X_RES;i++)
SetPixel(i,j,100);
getch();
CloseVesa();
}