// Имя файла с моей отсебятиной
#define MessageFileName "message.txt"

// Моя отсебятина... ;)
:byte MyMessage=FROM MessageFileName;

// Количество видимых символов
#define VisibleChars 320/8-1
#define CharsAmplitude 8

:byte CurrentColor=0;
:word CurrentPos;
:word XCharOffs;
:int YCharOffs;
:int DeltaYCharOffs;

// Моя интрушка...
Intro()
{
 XCharOffs=7;
 YCharOffs=0;
 DeltaYCharOffs=1;
 CurrentPos=VisibleChars;
 
 $push BP

  BP=0;

  // Зависае здесь пока не нажали клавишу ESC
  loop(){

   // Демочка...

    // Читаем очередную буквочку

    // Вывод в видео буфер картинки...
    PutWorkBufToVideoBuf();

    // x,y,char,color
    // void fastcall PutChar(DI,SI,DH,DL)
    // Обрабатываем VisibleChars символов начиная с BP
    FOR (BX=BP,DI=DeltaYCharOffs,DX=YCharOffs,CX=CurrentPos; CX<VisibleChars; CX++,BX++){
        // Если вылезли за границы, то выходим
        IF (BX>=sizeof(file MessageFileName)) BREAK;

        DX+=DI;
        IF (int DX<=-CharsAmplitude)||(int DX>=CharsAmplitude) -DI;

        // Если символ не перевод каретки и не возврат каретки (13,10)
        IF (MyMessage[BX]==10)||(MyMessage[BX]==13) CONTINUE;

        $push CX,BX,DX,DI
         // Выводим символ
         PutChar(CX*8+XCharOffs,int 200/2-8+DX,MyMessage[BX],CurrentColor);
        $pop DI,DX,BX,CX
    }
    IF (XCharOffs>0) XCharOffs--;
    ELSE{
       XCharOffs=7;
       IF (CurrentPos>0) CurrentPos--;
       ELSE{
          BP++;
          IF (BP==sizeof(file MessageFileName)){
             CurrentPos=VisibleChars;
             BP=0;
          }
       }
    }
    YCharOffs+=DeltaYCharOffs;
    IF (YCharOffs<=-CharsAmplitude)||(YCharOffs>=CharsAmplitude) -DeltaYCharOffs;

    // Ждем обратного хода луча
    WaitRetrace();

    // Вывод видеобуфера на экран
    PutVideoBuf();


   // Если нажали клавишу
   IF (KBHIT()){
      // Если это ESC, то выходим
      IF (byte ReadKey()==27) BREAK;
   }
  }

 $pop BP
}


