#include	<stdio.h>
#include	<conio.h>
#include	"sysp.h"
#include	"sysgraph.h"
#include	<dos.h>

int	main( void );
void	SetVideoMode( unsigned char );
void	Hello(void);
void __pascal __far SetVgaDAC(unsigned, unsigned);

//====================================================================
// Главная функция
//====================================================================
int main( void )
{
	RGB color_table[256];
	unsigned   i, j, iii;
	unsigned char   far *ptr;
	int error, x_num, y_num;
	unsigned seg_table,off_table;

// Записываем в массив color_table новые значения для
// регистров таблицы цветов
	for(j = 0; j < 4; j++) {
		for(i = 0; i < 64; i++) {
			(color_table[i+j*64]).red = (j == 0) ? i : 0;
			(color_table[i+j*64]).green = (j == 1) ? i : (j == 3) ? i : 0;
			(color_table[i+j*64]).blue = (j == 2) ? i : (j == 3) ? i : 0;
		}
	}

// Устанавливаем режим видеоадаптера номер 13h (256 цветов)
// данный режим поддерживается только VGA и Super VGA
	SetVideoMode( 0x13 );

// Определяем сегмент и смешение массива color_table
	ptr = (unsigned char far*) &color_table[0];
	seg_table = FP_SEG(ptr);
	off_table = FP_OFF(ptr);

// Загружаем новые значения в регистры таблицы цветов
	SetVgaDAC(seg_table,off_table);

// Записываем в ptr указатель на начало видеопамяти
	ptr = (unsigned char far*) (FP_MAKE(0xA000, 0x0));

// Выводим на экран вертикальные линии различного цвета,
// процессор записывает данные непосредственно в видеопамять
	for(y_num = 0; y_num < 200; y_num++) {
		for(x_num = 0; x_num < 320; x_num++) {
			*ptr = (unsigned char) x_num;
			ptr++;
		}
	}

// Ожидаем нажатие на клавишу
	getch();

// Плавно гасим изображение на экране, уменьшая значения
// регистров таблицы цветов
	for(i=0;i<320;i++){
		for(iii=0;iii<256;iii++)  {

			(color_table[iii]).red =
				((color_table[iii]).red>6) ? color_table[iii].red-1 : 1;

			(color_table[iii]).green =
				((color_table[iii]).green>6) ? color_table[iii].green-1 : 1;

			(color_table[iii]).blue =
				((color_table[iii]).blue>6) ? color_table[iii].blue-1 : 1;
		}
		SetVgaDAC(seg_table,off_table);
	}

// Ожидаем нажатие на клавишу
	SetVideoMode( 0x3 );
	Hello();

	return 0;
}


//==============================================================
// Функция устанавливает режим работы видеоадаптера, заданный
// параметром vmode
//==============================================================
void SetVideoMode( unsigned char vmode ) {

	union  REGS    inregs, outregs;

	inregs.h.ah = 0x0;
	inregs.h.al = vmode;
	int86( 0x10, &inregs, &outregs );
}


//==============================================================
// Функция выводит на экран краткую справку о программе
//==============================================================
void Hello(void) {

	printf("\nCopyright (C)Frolov G.V.,1995. E-mail: frolov@glas.apc.org\n");
}

