// "Micro3D" intro.
// (c)2001 Wega (2:5055/141.10@FidoNet)

// Текстмод
:fastcall TextMode()
{
 AX=03h; $int 10h
}


// Графмод
:fastcall GraphMode()
{
 AX=13h; $int 10h
}


// Вывод видеобуфера
:fastcall PutVideoBuf()
{
 $push DS
 $push GS
 $pop DS
 ES=0A000h;
 SI=0;DI=0;
 CX=320*200/2;
 $rep $movsw
 $pop DS
}


// Очистка видеобуфера
:fastcall ClrVideoBuf()
{
 ES=GS;
 DI=0;AX=0;
 CX=320*200/2;
 $rep $stosw
}


// Ожидание перерисовки экрана видеоадаптером
:fastcall WaitRetrace()
{
 asm{
  mov DX,03DAh
V1:
  in AL,DX
  and AL,08H
  jnz V1
V2:
  in AL,DX
  and AL,08H
  jz V2
 }
}


// Put Pixel
// word x, y; byte color
:fastcall PutPixel(AX,BX,CL)
{
 SI=BX<<6;
 AX+=SI;
 SI=BX<<8;
 SI+=AX;
 GSBYTE[SI]=CL;
}

// Put 3D Pixel
// word x, y, z; byte color
:fastcall PutPixel3D(AX,BX,DX,CL)
{
 DX=DX>>2;AX+=DX;BX+=DX;
 @PutPixel(AX,BX,CL);
}


// Начало
:fastcall Begin()
{
 @GraphMode();

 // Сегмент видеобуфера
 AX=DS;
 AX+=4096;
 GS=AX;

 // Палитра
 CX=255;
 loop(CX){
  DX=03C8h;
  AL=CL;
  $out DX,AL
  DX++;
  AL=AL>>1;
  $out DX,AL
  $out DX,AL
  AL=0;
  $out DX,AL
 }

 @ClrVideoBuf();

 $finit
}


// Конец
:fastcall End()
{
 @TextMode();
 AX=0; $int 16h
}
