#define    ESC_KEY 1
#define   LEFT_KEY 75
#define  RIGHT_KEY 77
#define     UP_KEY 72
#define   DOWN_KEY 80
#define INSERT_KEY 82
#define DELETE_KEY 83
#define   HOME_KEY 71
#define    END_KEY 79
#define   PGUP_KEY 73
#define   PGDN_KEY 81
#define  SPACE_KEY 57
#define  ENTER_KEY 28
#define  SHIFT_KEY 54
#define   CTRL_KEY 29
#define    ALT_KEY 56

// Установка графического режима
inline void fastcall setmode(AX)
{
	$int 0x10
}

// функция чтения клавиши
inline char fastcall scancode()
{
	$in AL,0x60
}

inline char fastcall kbHit()
{
//Почистим буфер клавиатуры и возвратим скан-код
	ES=getseg(0);
	ESWORD[0x041A]=ESWORD[0x041C];
	scancode();
}

// функция копирования блока памяти
:void fastcall memcpy(EDI,ESI,ECX)
{
	EAX=ECX;
	ECX>>=2;
	$rep $movsd
	ECX=EAX&3;
	$rep $movsb
}

// функция копирования блока памяти
inline void fastcall memcpyd(EDI,ESI,ECX)
{
	$rep $movsd
}

// функция заполнения блока памяти
:void fastcall memset(EDI,ECX,AL)
{
	AH=AL;
	ECX>>=1;
	$rep $stosw
	$adc ECX,ECX
	$rep $stosb
}

:void fastcall clearmemd(EDI,ECX)
{
	EAX=0;
	$rep $stosd
}

// системные часы
:char _h, _m, _s, _d;

:void gettime()
{
	AH=0x2C;
	$int 0x21;
	_h=CH;
	_m=CL;
	_s=DH;
	_d=DL;
}

:int pack_time(char _h, char _m, char _s,char _d)
{
	EAX=_h*60+_m*60+_s*100+_d;
}

:int get_packed_time()
{
	gettime();
	pack_time(_h, _m, _s, _d );
}

:void fastcall depack_time(EAX)
{
	ECX=100;
	EDX=0;
	$div ECX
	_d=DL;
	ECX=60;
	EDX=0;
	$div ECX
	_s=DL;
	EDX=0;
	$div ECX
	_m=DL;
	EDX=0;
	$div ECX
	_h=DL;
}

:short fastcall getseg(BX)
{
	AX=2;
	$INT 0x31
}
