?resize FALSE
?use80386
?parsecommandline TRUE

?include "PCXLOAD.H--"
?include "random.h--"

?define PALSIZE 256*3
?define SIZESCREEN 320*200

word buf1_seg;
word buf2_seg;
word buf3_seg;
word LineTable[200];

main()
{
  @SET320X400MODE();
  IF(@PARAMCOUNT()!=1)Error("\nДля запуска необходимо задать имя PCX файла.\n");
  AX=CS;
  AH+=0x10;
  buf1_seg=AX;
  AH+=0x10;
  buf2_seg=AX;
  AH+=0x10;
  buf3_seg=AX;
  SetupLineTable();
  @RANDOMIZE();
  CleanSegments();
  IF(loadPCX(@PARAMSTR(0),buf2_seg)!=0)Error("\nОшибка чтения PCX файла.\n");
  CHANGEPICTOR();
  do{
    SetRandomPoint();
    DoWater();
    DupeToScreen();
    buf1_seg><buf3_seg;
    AH=1;
    $int 0x16
  }while(ZEROFLAG);
  @BIOSREADKEY();
  AX=0x3;
  $int 0x10
}

void Error(word msg)
{
  AX=3;
  $int 0x10
  @WRITESTR(msg);
  @ABORT();
}

void CHANGEPICTOR()
{
  SI=0;
  FOR(DX=0;DX<200;DX++){
    FOR(DI=0;DI<320;DI++){
      ES=buf2_seg;
      $push DX
      WRITEPIXEL400(,byte ESBYTE[SI],DI);
      $pop DX
      SI++;
    }
  }
  DI=0;
  FOR(DX=199;int DX>=0;DX--){
    FOR(SI=0;SI<320;SI++){
      $push DX
      @READPIXEL400(,,SI);
      $pop DX
      ES=buf2_seg;
      $stosb
    }
  }
}

void SetupLineTable()
{
  BX=0;
  AX=0;
  CX=200;
  loop(CX){
    LineTable[BX]=AX;
    AX+=320;
    BX+=2;
  }
}

void CleanSegments()
{
  BX=buf1_seg;
  DX=2;
  EAX=0;
  DI=0;
  do{
    ES=BX;
    CX=0x4000;
    $rep
    $stosd
    BH+=0x20;
    DX--;
  }while(NOTZEROFLAG);
}

void SetRandomPoint()
{
	AX=@RAND()%SIZESCREEN;
  BX><AX;
  ES=buf1_seg;
  ESBYTE[BX]=0x7F;
}

void DupeToScreen()
{
  GS=buf1_seg;
  FS=buf2_seg;
  ES=0xA000;
  SI=0;
  FOR(DX=200;DX<400;DX++){
    FOR(DI=0;DI<320;DI++){
      BX=0;
      BL=GSBYTE[SI];
      BX<<=1;
      BX+=LineTable[BX];
      BX+=SI;
      $push DX
      WRITEPIXEL400(,byte FSBYTE[BX],DI);
      $pop DX
      SI++;
    }
  }
}

void DoWater()
{
  ES=buf3_seg;
  DS=buf1_seg;
  AX=0;
  FOR(DI=0;DI<SIZESCREEN;DI++){
    BX=0;
    $lea SI,DSWORD[DI-321]
    CX=3;
    loop(CX){
      $lodsb
      BX+=AX;
      $lodsb
      BX+=AX;
      $lodsb
      BX+=AX;
      SI+=317;
    }
    AL=DSBYTE[DI];
    BX-=AX;
    $sar BX,2
    AL=ESBYTE[DI];
    BX-=AX;
    IF(MINUSFLAG)BX=0;
    ESBYTE[DI]=BL;
  }
  DS=CS;
}
