  word  items = 0;

#define  MAXMSGLEN   80
struct tagMENU
{
  byte  message[MAXMSGLEN];  // Сообшение
  word  label;               // Метка выполнения
}menu[9];
//   -^, т.к используются также клавиши от 1..9 (не от 0!)


// Команда очистки меню
//
// ОПИСАНИЕ:
// Opcode: 0x0002 (word)
void clearmenu(void)
{
  items = 0;
}


// Команда добавления элемента меню
//
// ОПИСАНИЕ:
// Opcode: 0x0003 (word)
void addmenuitem(void)
  byte smb;
  word i=0;
{

  do
  {
     smb = GSBYTE[IP+i];
     menu[items].message[i] = smb;
     i++;

     IF (i>=MAXMSGLEN)
     {
        WRITESTR("Очень длинная строка");
        return;
     }
  }while(smb);

  IP+=i;

  menu[items].label = GSWORD[IP];
  IP+=2;

  items++;
}


// Команда вывода и действия меню
//
// ОПИСАНИЕ:
// Opcode: 0x0004 (word)
void getmenuitem(void)
   word i;
   word oldY;
   word cursel=0;
{
   YText++;

   DI = YText*80*2;
   ES = 0xb800;
   CX = 40;
   EAX = 0x07C407C4;
   $rep $stosd

   YText++;
   oldY = YText;

   do
   {
     YText=oldY;
     for(i=0; i<items; i++)
     {
       XText=1;
       textcolor=7;
       textbackground=0;

       if (cursel==i)
       {
          textcolor=15;
          textbackground=1;
       }
       WriteSymbol(' ');
       WriteSymbol(i+'1');
       WriteString(DS, ". ");
       WriteString(DS, #menu[i].message);
       WriteSymbol(' ');
       YText++;
     }

     AX=0;
     $int 0x16
     switch (AH)
     {
        case  80:
              if (cursel+1<items) cursel++;
              break;

        case  72:
              if (cursel) cursel--;
              break;

        case  28:
              IP = menu[cursel].label;
              return;

        case  1:
              QUIT=1;
              return;

        case  2...10:
              BX = 0;
              BL = AL-49;
              IF (BL>=items) break;
              IP = menu[BX].label;
              return;
     }

   }while();
}
