Код:
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <string.h>
///////////////////////////////////////////////////////////////
//Параметры текстового режима
#define MENUX 35 //Размеры окошка
#define MENUY 4
#define FONSIM 177 //Фоновый символ
#define FONCOL 0x25 //Фоновый цвет
#define ZAGLCOL 0x34 //Цвет заглавия
#define MENUCOL 0x24 //Цвет меню
#define BACKCOL 0x12 //Теневой цвет
///////////////////////////////////////////////////////////////
//Параметры графического режима
#define MAXX 640
#define MAXY 200
#define MAXCOL 16
///////////////////////////////////////////////////////////////
//Граф. плата
#define EGA_GRAPHICS 0x3ce //Регистры контроллера EGA
#define EGA_GR_SET_RESET 0 //Регистр установки/сброса
#define EGA_GR_ENABLE_SET_RESET 1 //Регистр разрешения установки/сброса
#define EGA_GR_DATA_ROTATE 3 //Регистр сдвига и способа записи
#define EGA_GR_MODE 5 //Регистр режима
#define EGA_GR_BIT_MASK 8 //Регистр битовой маски
///////////////////////////////////////////////////////////////
//Человек, перешагивающий препятствие
//Параметры преграды
#define PAUSE 250
#define PREGRX 100 //Координаты преграды
#define PREGRY 100
#define PREGRC 2 //Цвет
char pregr[6]={0xff,0xff,0xff,0xff,0xff,0xff}; //Спрайт
//Параметры спрайта человечка ╧1
char man1[14]={0x1c,0x3e,0x3e,0x8,0x3e,0x3e,0x3e,0x3e,0x3e,0x8,0x8,0x8,0x8,0x8};
char man2[14]={0,0x1c,0x3e,0x3e,0x8,0x3e,0x3e,0x3e,0x3e,0x3e,0x8,0x8,0x4,0x8};
char man3[14]={0,0,0x1c,0x3e,0x3e,0x8,0x3e,0x3e,0x3e,0x3e,0x3e,0x4,0x2,0x4};
#define MAN1X 83
#define MAN1Y 92
#define MAN1C 3
#define MAN2X 110
#define MAN2Y 92
#define MAN2C 3
unsigned manx[12]={83,83,85,87,92,95,100,103,106,108,110,110};
unsigned many[12]={92,90,88,86,83,83,83,83,86,88,90,92};
////////////////////////////////////////////////////////////////
//Поднимание/опускание перископа
char per1[5][7]={{0,0,0,0,0x7e,0xff,0xff},
{0,0,0,0x18,0x7e,0xff,0xff},
{0,0,0x18,0x18,0x7e,0xff,0xff},
{0,0x18,0x18,0x18,0x7e,0xff,0xff},
{0x18,0x18,0x18,0x18,0x7e,0xff,0xff}};
/////////////////////////////////////////////////////////////////
//Шарик, бегающий по бильярду
#define BILCOL 2 //Цвет бильярда
#define BILCOL2 4 //Цвет окаймления бильярда
//#define BILCOL3 4 //Цвет луз
#define BILCOL4 1 //Цвет шарика
#define BILADR (88/8+80/8*MAXX) //Адрес бильярда
#define CBILX 88
#define CBILY 80
#define BILX 60 //Длина бильярда по x/8
#define BILY 70 //Длина по y
//char luz1[4]={0x18,0x66,0xc3,0xc3};
char balls[4]={0x7e,0xff,0xff,0x7e};
/////////////////////////////////////////////////////////////////
void inv (unsigned x,unsigned y, unsigned len) //Инвертация
{
unsigned i;
char far * adr=(char *)MK_FP(0xb800,0);
adr+=x*2+y*160+1;
for (i=0;i<len;i++,adr+=2) *adr=*adr/16+(*adr % 16)*16;
}
void emt20 (char * buf,unsigned x,unsigned y) //Вывод текста по (x,y) из *buf
{
unsigned i;
char far * adr=(char *)MK_FP(0xb800,0);
adr+=x*2+y*160;
for (i=0;i<strlen(buf);i++,adr+=2) *adr=buf[i];
}
char bufscr[25*160]; //Буфер текстового экрана
void gotograph (void) //Переход в графический режим с запоминанием ситуации
{
char far * adr=(char *)MK_FP(0xb800,0);
unsigned i;
for (i=0;i<25*160;i++,adr++) {bufscr[i]=*adr;}
//Переход в граф. режим
asm {
mov AX,0x000E //640*200*16
int 0x10
}
}
void gototext (void) //Переход в текстовый режим с восстановлением ситуации
{
unsigned i;
char far * adr=(char *)MK_FP(0xb800,0);
//Переход в текст. режим
asm {
mov AX,0x0003
int 0x10
}
for (i=0;i<25*160;i++,adr++) {*adr=bufscr[i];}
}
void outspr (unsigned x,unsigned y,unsigned color,char * sprite,unsigned leny)
{
char far * adr=(char *)MK_FP(0xa000,0);
adr+=y*80+(x/8); //адрес текущего байта
outport (EGA_GRAPHICS,EGA_GR_MODE+0); //Режимы чтения и записи 0
outport (EGA_GRAPHICS,EGA_GR_SET_RESET+color*256); //Номер цвета
outport (EGA_GRAPHICS,EGA_GR_ENABLE_SET_RESET+0xf00); //Проц. байт не влияет
x=7-x % 8; //сдвиг по Оx
unsigned i;
for (i=0;i<leny;i++) {
if (x!=0) {
outport (EGA_GRAPHICS,EGA_GR_BIT_MASK+(((((unsigned int)sprite[i])&0xff)<<x)&0xff00));
(*adr)++;
}
outport (EGA_GRAPHICS,EGA_GR_BIT_MASK+((sprite[i]<<(8+x))&0xff00));
(*(adr+1))++;
adr+=MAXX/8;
}
}