#resize FALSE
#use80386
#codesize
#jumptomain NONE

#define XSIZE 160
#define YSIZE 100
#define BUFSIZE XSIZE*YSIZE*2
#define DAMPEN 4

char buf1[BUFSIZE];
char buf2[BUFSIZE];
word locobj[4];

main()
{
//Необходимый видеорежим
	AX=0x13;
	$int 0x10
	outport(0x4309,0x3D4);
//создать палитру
	BX=0;
	DL=0xC8;
	outp(0);
	DX++;
	do{
		AL=0;
		IF(BL<128)AL=127-BL>>1;
		outp(AL);
		outp(AL);
		CL=BL>>1;
		AL=127-CL>>1;
		outp(AL);
		BL++;
	}while(NOTZEROFLAG);
//очистить буфер
	DI=#buf1;
	BP=DI;	//BP - константа, хранит адрес одного из буферов
	CX=BUFSIZE+2;
	AX=0;
	$REP $STOSW
//и инициализировать позицию перемещающегося объекта
	AL=120;
	$stosw
	$stosw
	BX=#buf2; //BX - константа, хранит адрес другого буфера
	do{
		@WAITVSYNC(); //притормозить
//Вывод на экран из буфера
		$PUSH ES
		ES=0xA000;
		DI=0;
		CL=100;
		loop(CX){
			DX=160;
			loop(DX){
				AX=SSWORD[DI+BP]-SSWORD[DI-2+BP]>>3+100;
				AH=AL;
				$STOSW
			}
		}
		$POP ES
//Эффект воды
		DI=322;
		CL=98;
		loop(CX){
			DX=158;
			loop(DX){
				AX=SSWORD[BP+DI-320]+SSWORD[BP+DI-2]+
						SSWORD[BP+DI+2]+SSWORD[BP+DI+320];
				$SAR AX,1
				AX-=DSWORD[BX+DI];
				SI=AX;
				$SAR SI,DAMPEN
				AX-=SI;
				DSWORD[BX+DI]=AX;
				DI++;
				DI++;
			}
			DI+=4;
		}
		BX><BP;
//перемещение объекта
		DI=#locobj;
		CALCP(,,,XSIZE*4);	//x-координата
		SI><AX;
		AX=CALCP(,,,YSIZE*4)*160;	//y-координата
		SI+=AX;
		SI+=SI;
//сам объект
		AX=AX>>11+1;
		DX><AX;
		loop(DX){
			CL=DL;
			loop(CX){
				AX=900;
				SSWORD[SI+BP]=AX;
				AX=AX/2;
				DSWORD[BX+SI]=AX;
				SI++;
				SI++;
			}
			SI=SI+320-DX-DX;
		}
		AH=1;
		$int 0x16
	}while(ZEROFLAG);
	@BIOSREADKEY();
	AX=0x3;
	$int 0x10
}

word CALCP()
{
	AX=DSWORD[DI];
	AX++;
	IF(DSWORD[DI+4]>DX){
		AX--;
		AX--;
	}
	$STOSW
	DSWORD[DI+2]+=AX;
	AX=DSWORD[DI+2]>>3;
}
