void message(void);     // op:0x0000
void clrscr(void);      // op:0x0001
void clearmenu(void);   // op:0x0002
void addmenuitem(void); // op:0x0003
void getmenuitem(void); // op:0x0004
void EndQuest(void);    // op:0x0005
void xgoto(void);       // op:0x0006
void prisvoit(void);    // op:0x0007
void ifpervalue(void);  // op:0x0008
void ifperper(void);    // op:0x0009

#include  "menu.h--"
#include  "cpu.h--"


// Для операции if*
#define  ravno    0
#define  bolshe   1
#define  menshe   2
#define  neravno  3
#define  bolshe_ili_ravno  4
#define  menshe_ili_ravno  5


//---------------------------------

// Команда вывода сообщения на экран
//
// ОПИСАНИЕ:
// Opcode: 0x0000 (word)
//         строка...[0]
void message(void)
{
  textcolor = 7;
  IP += WriteString(GS, IP);
  IP++;
}


// Команда очистки сообщений
//
// ОПИСАНИЕ:
// Opcode: 0x0001 (word)
void clrscr(void)
{
   ES = 0xb800;
   DI = 0;
   EAX = 0x07000700;
   CX = 1000;
   $rep $stosd

   XText = 2;
   YText = 1;
   textcolor = 15;
   textbackground = 0;
}


// Команда завершения квеста
//
// ОПИСАНИЕ:
// Opcode: 0x0005 (word)
void EndQuest(void)
{
   QUIT = 1;
}


// Команда перехода
//
// ОПИСАНИЕ:
// Opcode: 0x0006 (word)
void xgoto(void)
{
   IP = GSWORD[IP];
}


// Команда присвоения переменной значения
//
// ОПИСАНИЕ:
// Opcode: 0x0007     (word)
//         переменная (word)
//         значение   (word)
void prisvoit(void)
{
   variable[GSWORD[IP]] = GSWORD[IP+2];
   IP+=4;
}


// Команда сравнения переменной с числом
//
// ОПИСАНИЕ:
// Opcode: 0x0008     (word)
//         переменная (word)
//         операция   (word)
//         значение   (word)
//         метка      (word)
// if (var [=,>,<,<>,>=,<=] value) then goto labl
void ifpervalue(void)
   word  var, oper, value, label;
{
   var   = variable[GSWORD[IP]];
   oper  = GSWORD[IP+2];
   value = GSWORD[IP+4];
   label = GSWORD[IP+6];

   switch (oper)
   {
       case  ravno:
             if (var==value) { IP = label; return; }
             break;

       case  bolshe:
             if (var>value) { IP = label; return; }
             break;

       case  menshe:
             if (var<value) { IP = label; return; }
             break;

       case  neravno:
             if (var!=value) { IP = label; return; }
             break;

       case  bolshe_ili_ravno:
             if (var>=value) { IP = label; return; }
             break;

       case  menshe_ili_ravno:
             if (var<=value) { IP = label; return; }
             break;
   }

   IP+=8;
}


// Команда сравнения переменной с переменной
//
// ОПИСАНИЕ:
// Opcode: 0x0009     (word)
//         переменная (word)
//         операция   (word)
//         переменная (word)
//         метка      (word)
// if (var [=,>,<,<>,>=,<=] value) then goto labl
void ifperper(void)
   word  var1, oper, var2, label;
{
   var1  = variable[GSWORD[IP]];
   oper  = GSWORD[IP+2];
   var2  = variable[GSWORD[IP+4]];
   label = GSWORD[IP+6];

   switch (oper)
   {
       case  ravno:
             if (var1==var2) { IP = label; return; }
             break;

       case  bolshe:
             if (var1>var2) { IP = label; return; }
             break;

       case  menshe:
             if (var1<var2) { IP = label; return; }
             break;

       case  neravno:
             if (var1!=var2) { IP = label; return; }
             break;

       case  bolshe_ili_ravno:
             if (var1>=var2) { IP = label; return; }
             break;

       case  menshe_ili_ravno:
             if (var1<=var2) { IP = label; return; }
             break;
   }

   IP+=8;
}
