//// imported
 
//тхчфх, уфх эєцхэ ёЄЁюъют√щ ярЁрьхЄЁ, шёяюы№чєхЄё  _joined (ъЁюьх call - Єрь _callee)
 
#include "../_sdk/typecode.h"
 
#include "../_sdk/str.h"
 
#include "../_sdk/emit.h"
 
 
 
#ifdef TARGET_THUMB
 
#include "sizesarm.h"
 
#else
 
#ifdef TARGET_SCRIPT
 
#include "sizesspt.h"
 
#else
 
#ifdef TARGET_386
 
#include "sizes386.h"
 
#else
 
#include "sizesz80.h"
 
#endif
 
#endif
 
#endif
 
 
 
CONST BYTE _typeshift[32]; //log ЁрчьхЁ Єшяр (n фы  2^n срщЄ)
 
CONST BYTE _typesz[32];
 
 
 
CONST BYTE _RMAIN; //ЁхушёЄЁ Ёхчєы№ЄрЄр ш 1-ую ярЁрьхЄЁр ёЄрэфрЁЄэ√ї ЇєэъЎшщ
 
//#endif
 
 
 
EXPORT VAR TYPE _t; //Єхъє∙шщ Єшя (фы  cmds)
 
EXPORT VAR BOOL _isloc; //ыюъры№эр  ыш яЁюўшЄрээр  яхЁхьхээр 
 
 
 
//EXTERN PCHAR _tword; //Єхъє∙хх ёыютю
 
//EXTERN UINT _lentword;
 
EXPORT VAR PCHAR _name; //ьхЄър схч яЁхЇшъёр (фы  ЄрсышЎ√ ьхЄюъ)
 
EXPORT VAR UINT  _lenname;
 
EXPORT VAR PCHAR _joined; //ртЄюьхЄър
 
EXPORT VAR UINT  _lenjoined;
 
 
 
#ifdef TARGET_THUMB
 
#include "codearm.c"
 
#else
 
#ifdef TARGET_SCRIPT
 
#include "codespt.c"
 
#else
 
#ifdef TARGET_386
 
#include "code386.c"
 
#else
 
#include "codez80.c"
 
#endif
 
#endif
 
#endif
 
 
 
#include "regs.c"
 
 
 
////
 
 
 
VAR PCHAR _const; //ёЄрЁр  ъюэёЄрэЄр
 
VAR UINT  _lenconst;
 
VAR BOOL _wasconst;
 
VAR CHAR  _sc[_STRLEN]; //ёЄрЁр  ъюэёЄрэЄр
 
VAR TYPE _wast;
 
 
 
VAR BYTE _sz; //тЁхьхээю ЁрчьхЁ Єшяр - шёяюы№чєхЄё  т Ёрчэ√ї яЁюЎхфєЁрї
 
 
 
#define _STRSTKMAX 256
 
VAR CHAR _strstk[_STRSTKMAX]; //str1+<len>+str2+<len>...+strN+<len> //с√ыю ' '+str1+' '+str2+...+' '+strN
 
EXPORT VAR UINT _lenstrstk;
 
 
 
#ifdef BIGMEM
 
#define _LBLBUFSZ 0xffff
 
#else
 
#define _LBLBUFSZ 0x2300 /**0x2100*/
 
#endif
 
VAR UINT _lblbuffreeidx; //[1];
 
VAR UINT _oldlblbuffreeidx; //[1];
 
CONST UINT _LBLBUFEOF = 0xffff;
 
#define _LBLBUFMAXSHIFT (UINT)(_LBLBUFSZ-_STRLEN-20)
 
//todo фшэрьшўхёъш т√фхышЄ№
 
VAR UINT _lblshift[0x100];
 
VAR UINT _oldlblshift[0x100];
 
VAR BYTE _lbls[_LBLBUFSZ];
 
 
 
EXPORT VAR UINT _typeaddr;
 
EXPORT VAR UINT _varszaddr;
 
EXPORT VAR UINT _varsz;
 
 
 
FUNC TYPE lbltype FORWARD(); //тхЁэєЄ№ Єшя ьхЄъш _name
 
 
 
PROC cmdshl1 FORWARD();
 
 
 
PROC errtype(PCHAR msg, TYPE t)
 
{
 
  errstr("operation "); errstr(msg); errstr(" bad type="); erruint((UINT)t); enderr();
 
}
 
 
 
EXPORT PROC strpush(PCHAR s, UINT len) //joined шыш callee
 
{ //str1+<len>+str2+<len>...+strN+<len> (ё ЄхЁьшэрЄюЁрьш)
 
  IF ((_lenstrstk+len+2) > _STRSTKMAX) {
 
    errstr("STRING STACK OVERFLOW"); enderr();
 
  }ELSE {
 
    strcopy(s, len, &_strstk[_lenstrstk]);
 
    _lenstrstk = _lenstrstk + len + 1;
 
    _strstk[_lenstrstk] = (CHAR)((BYTE)len);
 
    INC _lenstrstk;
 
  };
 
}
 
 
 
EXPORT FUNC UINT strpop(PCHAR s)
 
{ //str1+<len>+str2+<len>...+strN+<len> (ё ЄхЁьшэрЄюЁрьш)
 
VAR UINT len;
 
  DEC _lenstrstk;
 
  len = (UINT)((BYTE)(_strstk[_lenstrstk]));
 
  _lenstrstk = _lenstrstk - len - 1;
 
  strcopy((PCHAR)(&_strstk[_lenstrstk]), len, s);
 
RETURN len;
 
}
 
 
 
//#define _LBLBUFSZ (UINT)(+sizeof(UINT)*0x100) /**эхы№ч  sizeof т рёьх*/
 
EXPORT PROC keepvars() //яхЁхф эрўрыюь ыюъры№э√ї ьхЄюъ
 
{
 
  memcopy((PBYTE)_lblshift, +sizeof(UINT)*0x100 /**todo const*/, (PBYTE)_oldlblshift);
 
  _oldlblbuffreeidx = _lblbuffreeidx;
 
}
 
 
 
EXPORT PROC undovars() //яюёых ыюъры№э√ї ьхЄюъ (чрс√Є№ шї)
 
{
 
  memcopy((PBYTE)_oldlblshift, +sizeof(UINT)*0x100 /**todo const*/, (PBYTE)_lblshift);
 
  _lblbuffreeidx = _oldlblbuffreeidx;
 
}
 
 
 
//////////////////////////////// MATH ///////////////////////////////////////
 
//яЁюЎхфєЁ√ эх чэр■Є ш эх ЄЁюур■Є Ёхцшь√ ЁхушёЄЁют
 
 
 
EXPORT PROC var_alignwsz_label(TYPE t)
 
{
 
  IF (_typesz[t&_TYPEMASK]!=_SZ_BYTE) {
 
    var_alignwsz();
 
  };
 
  emitvarlabel(_joined);
 
}
 
 
 
EXPORT PROC var_def(TYPE t, PCHAR s) //фюёЄєяэю шч compile!
 
{
 
VAR BYTE sz = _typesz[t];
 
  IF (sz==_SZ_REG/**(tmasked==_T_INT)||(tmasked==_T_UINT)*/) {
 
    var_dw(); varstr(s); endvar(); //°шЁшэр DW Ёртэр uint
 
  }ELSE IF (sz==_SZ_BYTE/**(tmasked==_T_BYTE)||(tmasked==_T_CHAR)||(tmasked==_T_BOOL)*/) {
 
    var_db(); varstr(s); endvar();
 
  }ELSE IF (sz==_SZ_LONG/**tmasked==_T_LONG*/) {
 
    var_dl(); varstr(s); endvar();
 
  }ELSE { errstr( "const bad type " ); erruint((UINT)t); enderr(); };
 
}
 
 
 
PROC pushconst() //ёюїЁрэ хЄ ўшёыю, ъюЄюЁюх эх ёюїЁрэшыш яЁш pushnum
 
{ //эхы№ч  чрЄшЁрЄ№ joined
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";pushconst " ); cmtstr( _const ); endcmt();
 
#endif
 
  //_lenwastword = strcopy(_joined, _lenjoined, _wastword);
 
  //_lenjoined = strcopy(_const, _lenconst, _joined);
 
  _sz = _typesz[_wast];
 
  IF (_sz==_SZ_BYTE) { //(_wast==_T_BYTE)||(_wast==_T_CHAR)||(_wast==_T_BOOL)
 
    getrfree(); //_rnew
 
    emitloadb();
 
  }ELSE IF (_sz==_SZ_REG) { //(_wast==_T_INT)||(_wast==_T_UINT)||(_wast>=_T_POI)
 
    getrfree(); //_rnew
 
    emitloadrg(+FALSE);
 
  }ELSE IF (_sz==_SZ_LONG) { //_wast==_T_LONG
 
    getrfree(); //_rnew
 
    emitloadrg(+TRUE); //high
 
    getrfree(); //_rnew
 
    emitloadrg(+FALSE); //low
 
  }ELSE errtype("pushconst",_wast);
 
  //_lenjoined = strcopy(_wastword, _lenwastword, _joined);
 
  _wasconst = +FALSE;
 
}
 
 
 
EXPORT PROC cmdpushnum()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";PUSHNUM "); cmtstr(_joined); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _lenconst = strcopy(_joined, _lenjoined, _const);
 
  _wast = _t;
 
  _wasconst = +TRUE;
 
}
 
 
 
EXPORT PROC cmdpushvar()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";PUSHVAR "); cmtstr(_joined); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE/**(_t==_T_BYTE)||(_t==_T_CHAR)||(_t==_T_BOOL)*/) {
 
    getrfree(); //_rnew
 
    emitgetb();
 
  }ELSE IF (_sz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrfree(); //_rnew
 
    emitgetrg(+FALSE);
 
  }ELSE IF (_sz==_SZ_LONG/**_t==_T_LONG*/) {
 
    getrfree(); //_rnew
 
    emitgetrg(+TRUE); //high
 
    getrfree(); //_rnew
 
    emitgetrg(+FALSE); //low
 
  }ELSE errtype("pushvar",_t);
 
}
 
 
 
EXPORT PROC cmdpopvar()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";POPVAR "); cmtstr(_joined); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE/**(_t==_T_BYTE)||(_t==_T_CHAR)||(_t==_T_BOOL)*/) {
 
    getrnew();
 
    emitputb();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrnew();
 
    emitputrg(+FALSE);
 
    freernew();
 
  }ELSE IF (_sz==_SZ_LONG/**_t==_T_LONG*/) {
 
    getrnew();
 
    emitputrg(+FALSE); //low
 
    freernew();
 
    getrnew();
 
    emitputrg(+TRUE); //high
 
    freernew();
 
  }ELSE errtype("popvar",_t);
 
}
 
 
 
EXPORT PROC cmdcastto(TYPE t2)
 
{
 
VAR BYTE tsz;
 
VAR BYTE t2sz;
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION cast "); cmtuint((UINT)_t); cmt('>'); cmtuint((UINT)t2); endcmt();
 
#endif
 
  tsz = _typesz[_t];
 
  t2sz = _typesz[t2];
 
#ifdef TARGET_SCRIPT
 
  IF (_t == t2) {
 
  }ELSE IF (t2==_T_FLOAT) {
 
    IF (_wasconst) pushconst(); //эх яюЁЄшь ъюэёЄрэЄє яЁш BYTE<=>CHAR
 
    IF (_t==_T_INT) {emitinttofloat(); //(FLOAT)intval - эхёютьхёЄшью ё C!
 
    }ELSE {goto bad;
 
    };
 
  }ELSE IF (_t==_T_FLOAT) {
 
    IF (_wasconst) pushconst(); //эх яюЁЄшь ъюэёЄрэЄє яЁш BYTE<=>CHAR
 
    IF (t2==_T_INT) {emitfloattoint(); //(INT)floatval - эхёютьхёЄшью ё C!
 
    }ELSE {goto bad;
 
    };
 
  }ELSE
 
#endif
 
  IF (tsz==t2sz/**_t == t2*/) { //Єшя√ юфэюую ЁрчьхЁр - эх яюЁЄшь ъюэёЄрэЄє
 
    //todo badcast LONG<=>FLOAT
 
  }ELSE {
 
    IF (_wasconst) pushconst(); //эх яюЁЄшь ъюэёЄрэЄє яЁш BYTE<=>CHAR
 
    IF (tsz==_SZ_BYTE/**_t==_T_BYTE*/) { //BYTE =>
 
      IF (t2sz==_SZ_REG/**(t2==_T_INT)||(t2==_T_UINT)*/) { //BYTE => INT|UINT
 
        getrnew();
 
        emitbtorg();
 
      }ELSE /**IF (t2sz==_SZ_LONG)*/ { //BYTE => LONG
 
        getrnew();
 
        emitbtorg();
 
        getrfree(); //_rnew
 
        emitloadrg0(); //ЄхяхЁ№ old = rg, new = 0
 
        swaptop(); //ЄхяхЁ№ old = 0, new = rg
 
      //}ELSE IF (t2==_T_CHAR) { //BYTE => CHAR
 
      //}ELSE IF (t2==_T_BOOL) { //BYTE => BOOL (for serialization)
 
      };//ELSE goto bad;
 
    }ELSE IF (tsz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)*/) {
 
      IF (t2sz==_SZ_BYTE/**t2==_T_BYTE*/) { //INT|UINT => BYTE
 
        getrnew();
 
        emitrgtob();
 
      }ELSE /**IF (t2sz==_SZ_LONG)*/ { //INT|UINT => LONG
 
        getrfree(); //_rnew
 
        //IF (_t==_T_UINT) { //UINT => LONG
 
          emitloadrg0(); //ЄхяхЁ№ old = rg, new = 0
 
        //}ELSE IF (_t==_T_UINT) { //INT => LONG
 
        //};
 
        swaptop(); //ЄхяхЁ№ old = 0, new = rg
 
      //}ELSE IF (t2>=_T_POI) { //UINT => POINTER (INT possible but not desirable)
 
      };//ELSE goto bad;
 
    }ELSE IF (tsz==_SZ_LONG) { //LONG =>
 
      IF (t2sz==_SZ_REG/**(t2==_T_INT)||(t2==_T_UINT)*/) { //LONG => INT|UINT
 
        swaptop(); //ЄхяхЁ№ old = low, new = high
 
        freernew(); //high
 
      }ELSE /**IF (t2sz==_SZ_BYTE)*/ { //LONG => BYTE
 
        swaptop(); //ЄхяхЁ№ old = low, new = high
 
        freernew(); //high
 
        getrnew();
 
        emitrgtob();
 
/**      }ELSE { //LONG<=>FLOAT
 
        goto bad;
 
        errstr("bad cast: "); erruint((UINT)_t); err('>'); erruint((UINT)t2); enderr();*/
 
      };
 
    //}ELSE IF ( (_t==_T_CHAR) && (t2==_T_BYTE) ) { //CHAR => BYTE
 
    //}ELSE IF ( (_t==_T_BOOL) && (t2==_T_BYTE) ) { //BOOL => BYTE (for serialization)
 
    //}ELSE IF ( (_t>=_T_POI) && ((t2==_T_UINT)||(t2>=_T_POI)) ) { //POINTER => UINT|POINTER (conversion between pointers)
 
    //}ELSE IF ((t2&_T_POI)!=0x00) { // anything (i.e. array) => POINTER
 
    }ELSE { //яю шфхх эшъюуфр эх яЁюшчющф╕Є
 
      bad:
 
      errstr("bad cast: "); erruint((UINT)_t); err('>'); erruint((UINT)t2); enderr();
 
    };
 
  };
 
  _t = t2;
 
}
 
 
 
EXPORT PROC cmdadd()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION +"); endcmt();
 
#endif
 
  IF (_t==_T_BYTE) {
 
    IF (_wasconst) {
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";cmdadd _wasconst"); endcmt();
 
#endif
 
      getrnew();
 
      emitaddbconst();
 
      _wasconst = +FALSE;
 
    }ELSE {
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";cmdadd !_wasconst"); endcmt();
 
#endif
 
      getrnew();
 
      getrold();
 
      emitaddb();
 
      freernew();
 
    };
 
  }ELSE {
 
    IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
    IF (_t==_T_FLOAT) {emitaddfloat();
 
    }ELSE
 
#endif
 
    IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
      getrold(); //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew();
 
      emitaddrg(); //rold+rnew => rold
 
      freernew();
 
    }ELSE IF (_t==_T_LONG) { //эх float
 
      getrold2(); //oldlow //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newlow
 
      emitaddrg(); //old2+new => old2
 
      freernew();
 
      //ЄхяхЁ№ new=newhigh, old=(oldlow+newlow)
 
      getrold2(); //oldhigh шч ёЄхър //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newhigh
 
      emitadcrg(); //old2+new+CY => old2
 
      freernew();
 
      //ЄхяхЁ№ new=(oldlow+newlow), old=(oldhigh+newhigh+CY)
 
    }ELSE errtype("+",_t);
 
  };
 
}
 
 
 
EXPORT PROC cmdsub() //шч ёЄрЁюую т√ўхёЄ№ эютюх!
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION -" ); endcmt();
 
#endif
 
  IF (_t==_T_BYTE) {
 
    IF (_wasconst) {
 
      getrnew();
 
      emitsubbconst();
 
      _wasconst = +FALSE;
 
    }ELSE {
 
      getrnew();
 
      getrold();
 
      emitsubb();
 
      freernew();
 
    };
 
  }ELSE {
 
    IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
    IF (_t==_T_FLOAT) {emitsubfloat();
 
    }ELSE
 
#endif
 
    IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
      getrold(); //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew();
 
      emitsubrg(); //rold-rnew => rold
 
      freernew();
 
      //IF(_t>=_T_POI) {t = _T_INT;};
 
    }ELSE IF (_t==_T_LONG) { //эх float
 
      getrold2(); //oldlow //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newlow
 
      emitsubrg(); //old2-new => old2
 
      freernew();
 
      //ЄхяхЁ№ new=newhigh, old=(oldlow-newlow)
 
      getrold2(); //oldhigh шч ёЄхър //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newhigh
 
      emitsbcrg(); //old2-new-CY => old2
 
      freernew();
 
      //ЄхяхЁ№ new=(oldlow-newlow), old=(oldhigh-newhigh-CY)
 
    }ELSE errtype("-",_t);
 
  };
 
}
 
 
 
EXPORT PROC cmdaddpoi() //_t ёюфхЁцшЄ Єшя  ўхщъш ьрёёштр
 
{
 
VAR BYTE i;
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION +poi"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
/**  i = _typeshift[_t&_TYPEMASK];
 
  WHILE (i != 0x00) {
 
    _t = _T_INT;
 
    cmdshl1();
 
    DEC i;
 
  };*/
 
  getrold(); //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
  getrnew();
 
  i = _typesz[_t&_TYPEMASK];
 
  WHILE (i != 0x00) {
 
    emitaddrg(); //rold+rnew => rold
 
    DEC i;
 
  };
 
  freernew();
 
}
 
 
 
EXPORT PROC cmdmul()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION *" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_BYTE) {emitmulbyte();
 
  }ELSE IF ( (_t==_T_UINT)||(_t==_T_INT) ) {emitmuluint();
 
  }ELSE IF (_t==_T_LONG) {emitmullong();
 
  }ELSE IF (_t==_T_FLOAT) {emitmulfloat();
 
#else
 
  IF (_t==_T_BYTE) {emitcall2rgs("_MULB.");
 
  }ELSE IF (_t==_T_UINT) {emitcall2rgs("_MUL.");
 
  }ELSE IF (_t==_T_INT) {emitcall2rgs("_MULSIGNED.");
 
  }ELSE IF (_t==_T_LONG) {emitcall4rgs("_MULLONG.");
 
#endif
 
  }ELSE errtype("*",_t);
 
}
 
 
 
EXPORT PROC cmddiv() //ёЄрЁюх ЁрчфхышЄ№ эр эютюх!
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION /"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_BYTE) {emitdivbyte();
 
  }ELSE IF (_t==_T_UINT) {emitdivuint();
 
  }ELSE IF (_t==_T_INT) {emitdivint();
 
  }ELSE IF (_t==_T_LONG) {emitdivlong();
 
  }ELSE IF (_t==_T_FLOAT) {emitdivfloat();
 
#else
 
  IF (_t==_T_BYTE) {emitcall2rgs("_DIVB.");
 
  }ELSE IF (_t==_T_UINT) {emitcall2rgs("_DIV.");
 
  }ELSE IF (_t==_T_INT) {emitcall2rgs("_DIVSIGNED.");
 
  }ELSE IF (_t==_T_LONG) {emitcall4rgs("_DIVLONG.");
 
#endif
 
  }ELSE errtype("/",_t);
 
}
 
 
 
EXPORT PROC cmdshl() //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION shl" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_BYTE) {emitshlbyte();
 
  }ELSE IF ( (_t==_T_UINT)||(_t==_T_INT) ) {emitshluint();
 
  }ELSE IF (_t==_T_LONG) {emitshllong();
 
#else
 
  IF (_t==_T_BYTE) {emitcall2rgs("_SHLB.");
 
  }ELSE IF ( (_t==_T_INT)||(_t==_T_UINT) ) {emitcall2rgs("_SHL.");
 
  }ELSE IF (_t==_T_LONG) {emitcall4rgs("_SHLLONG.");
 
#endif
 
  }ELSE errtype("<<",_t);
 
}
 
 
 
EXPORT PROC cmdshr() //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION shr" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_BYTE) {emitshrbyte();
 
  }ELSE IF (_t==_T_UINT) {emitshruint();
 
  }ELSE IF (_t==_T_INT) {emitshrint();
 
  }ELSE IF (_t==_T_LONG) {emitshrlong();
 
#else
 
  IF (_t==_T_BYTE) {emitcall2rgs("_SHRB.");
 
  }ELSE IF (_t==_T_UINT) {emitcall2rgs("_SHR.");
 
  }ELSE IF (_t==_T_INT) {emitcall2rgs("_SHRSIGNED.");
 
  }ELSE IF (_t==_T_LONG) {emitcall4rgs("_SHRLONG.");
 
#endif
 
  }ELSE errtype(">>",_t);
 
}
 
 
 
EXPORT PROC cmdshl1()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";SHL1" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  IF (_t==_T_BYTE) {
 
    getrnew();
 
    emitshl1b();
 
  }ELSE IF ( (_t==_T_INT)||(_t==_T_UINT) ) {
 
    getrnew();
 
    emitshl1rg();
 
  //}ELSE IF (_t==_T_LONG) { //todo
 
  }ELSE errtype("shl1",_t);
 
}
 
/**
 
EXPORT PROC cmdshr1()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";SHR1" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  IF ( (_t==_T_BYTE)||(_t==_T_CHAR) ) {emitshr1rgb(getrnew());
 
  }ELSE IF (_t==_T_INT) {emitshr1signedrg(getrnew());
 
  }ELSE IF (_t==_T_UINT) {emitshr1rg(getrnew());
 
  }ELSE errtype("shr1",_t);
 
}
 
*/
 
EXPORT PROC cmdand()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION &" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    getrold();
 
    getandb();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getrnew();
 
    getrold();
 
    emitandrg();
 
    freernew();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrnew();
 
    getrold2();
 
    emitandrg(); //low
 
    freernew();
 
    getrnew();
 
    getrold2();
 
    emitandrg(); //high
 
    freernew();
 
  };//ELSE errtype("&",_t);
 
}
 
 
 
EXPORT PROC cmdor()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION |" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    getrold();
 
    getorb();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getrnew();
 
    getrold();
 
    emitorrg();
 
    freernew();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrnew();
 
    getrold2();
 
    emitorrg(); //low
 
    freernew();
 
    getrnew();
 
    getrold2();
 
    emitorrg(); //high
 
    freernew();
 
  };//ELSE errtype("|",_t);
 
}
 
 
 
EXPORT PROC cmdxor()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION ^" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    getrold();
 
    getxorb();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getrnew();
 
    getrold();
 
    emitxorrg();
 
    freernew();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrnew();
 
    getrold2();
 
    emitxorrg(); //low
 
    freernew();
 
    getrnew();
 
    getrold2();
 
    emitxorrg(); //high
 
    freernew();
 
  };//ELSE errtype("^",_t);
 
}
 
 
 
EXPORT PROC cmdpoke() //эютюх чряшё√трхь т ёЄрЁє■ ыюърЎш■ ярь Єш
 
{ //_t = Єшя фрээ√ї яюф єърчрЄхыхь
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";POKE"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE/**(_t==_T_BYTE)||(_t==_T_CHAR)||(_t==_T_BOOL)*/) {
 
    getrnew();
 
    getrold();
 
    emitpokeb();
 
    freernew();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrnew();
 
    getrold();
 
    emitpokerg();
 
    freernew();
 
    freernew();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrnew();
 
    getrold2(); _rold2 = _rold;
 
    getrold();
 
    emitpokelong();
 
    freernew();
 
    freernew();
 
    freernew();
 
  };//ELSE errtype("poke",_t); //яю шфхх эшъюуфр
 
}
 
 
 
EXPORT PROC cmdpeek() //_t = Єшя фрээ√ї яюф єърчрЄхыхь, эх const
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";PEEK" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE/**(_t==_T_BYTE)||(_t==_T_CHAR)||(_t==_T_BOOL)*/) {
 
    getrnew();
 
    emitpeekb();
 
  }ELSE IF (_sz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrnew();
 
    emitpeekrg();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrfree(); //_rnew
 
    getrnew();
 
    getrold();
 
    emitpeeklong();
 
  };//ELSE errtype("peek",_t); //яю шфхх эшъюуфр
 
}
 
 
 
EXPORT PROC cmdneg()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";NEG" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  IF ( (_t==_T_INT)||(_t==_T_UINT) ) {
 
    getrnew();
 
    emitnegrg();
 
#ifdef TARGET_SCRIPT
 
  }ELSE IF (_t==_T_FLOAT) { emitnegfloat();
 
#endif
 
  }ELSE errtype("neg",_t);
 
}
 
 
 
EXPORT PROC cmdinv()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";INV" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    emitinvb();
 
  }ELSE IF (_sz == _SZ_REG) {
 
    getrnew();
 
    emitinvrg();
 
  }ELSE /**IF (_t==_T_LONG)*/ {
 
    getrnew();
 
    emitinvrg();
 
    getrold(); _rnew = _rold;
 
    emitinvrg();
 
  };//ELSE errtype("inv",_t);
 
}
 
 
 
EXPORT PROC cmdinc() //no float
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION ++"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  IF (_t==_T_BYTE) {
 
    prefernoregs(); //Єюы№ъю [hl]
 
    _t = _T_POI|_T_BYTE; cmdpushnum();
 
    IF (_wasconst) pushconst();
 
    getrnew();
 
    emitincb_bypoi();
 
    freernew();
 
  }ELSE IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrfree(); //_rnew
 
    //emitgetrg(+FALSE);
 
    emitincrg_byname();
 
    //emitputrg(+FALSE);
 
    freernew();
 
/**  }ELSE IF (_t==_T_LONG) {
 
    emitinclong();
 
*/
 
  }ELSE errtype("inc",_t);
 
}
 
 
 
EXPORT PROC cmddec() //no float
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION --" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  IF (_t==_T_BYTE) {
 
    prefernoregs(); //Єюы№ъю [hl]
 
    _t = _T_POI|_T_BYTE; cmdpushnum();
 
    IF (_wasconst) pushconst();
 
    getrnew();
 
    emitdecb_bypoi();
 
    freernew();
 
  }ELSE IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrfree(); //_rnew
 
    //emitgetrg(+FALSE);
 
    emitdecrg_byname();
 
    //emitputrg(+FALSE);
 
    freernew();
 
/**  }ELSE IF (_t==_T_LONG) {
 
    emitdeclong();
 
*/
 
  }ELSE errtype("dec",_t);
 
}
 
 
 
EXPORT PROC cmdincbyaddr() //no float
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION ++byaddr"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  getrnew();
 
  IF (_t==_T_BYTE) {
 
    emitincb_bypoi(); //[new]
 
  }ELSE IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrfree();
 
    getrold();
 
    emitincrg_bypoi(); //[old]
 
    freernew();
 
/**  }ELSE IF (_t==_T_LONG) {
 
    emitinclong();
 
*/
 
  }ELSE errtype("incbypoi",_t);
 
  freernew();
 
}
 
 
 
EXPORT PROC cmddecbyaddr() //no float
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";OPERATION --byaddr"); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  getrnew();
 
  IF (_t==_T_BYTE) {
 
    emitdecb_bypoi(); //[new]
 
  }ELSE IF (_typesz[_t]==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
    getrfree();
 
    getrold();
 
    emitdecrg_bypoi(); //[old]
 
    freernew();
 
/**  }ELSE IF (_t==_T_LONG) {
 
    emitdeclong();
 
*/
 
  }ELSE errtype("decbypoi",_t);
 
  freernew();
 
}
 
 
 
//////////////////////////////////
 
//ёЁртэхэш 
 
 
 
EXPORT PROC cmdless() //ёЄрЁюх ьхэ№°х эютюую
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION <" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_FLOAT) {
 
    emitlessfloat();
 
  }ELSE IF (_t==_T_BYTE) {
 
    emitlessb();
 
  }ELSE IF (_t==_T_UINT) {
 
    emitless();
 
  }ELSE IF (_t==_T_INT) {
 
    emitlesssigned();
 
#else
 
  IF (_t==_T_BYTE) {
 
    getrnew();
 
    //IF (_wasconst) {
 
    //  emitsubbzconst(); //new-<const> //Z80 only??? or else add emitsubbflagsconst
 
    //  _wasconst = +FALSE;
 
    //}ELSE {
 
      getrold();
 
      emitsubbflags(_rnew, _rold); //old-new
 
      freernew();
 
    //};
 
    freernew();
 
    getrfree(); //_rnew
 
    emitcytob();
 
  }ELSE {
 
  //IF (_wasconst) pushconst();
 
  IF (_t==_T_UINT) {
 
    getrnew();
 
    getrold();
 
    emitsubflags(_rnew, _rold); //old-new
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitcytob();
 
  }ELSE IF (_t==_T_INT) {
 
    getrnew();
 
    getrold();
 
    emitsubflags(_rnew, _rold); //old-new
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitSxorVtob(); //S xor overflow
 
  //}ELSE IF (_t==_T_LONG) {
 
#endif
 
  }ELSE errtype("<",_t);
 
  };
 
  _t = _T_BOOL;
 
}
 
 
 
EXPORT PROC cmdmore() //ёЄрЁюх сюы№°х эютюую
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION >" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_FLOAT) {
 
    emitmorefloat();
 
  }ELSE IF (_t==_T_BYTE) {
 
    emitmoreb();
 
  }ELSE IF (_t==_T_UINT) {
 
    emitmore();
 
  }ELSE IF (_t==_T_INT) {
 
    emitmoresigned();
 
#else
 
  IF (_t==_T_BYTE) {
 
    getrold();
 
    getrnew();
 
    emitsubbflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitcytob();
 
  }ELSE IF (_t==_T_UINT) {
 
    getrold();
 
    getrnew();
 
    emitsubflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitcytob();
 
  }ELSE IF (_t==_T_INT) {
 
    getrold();
 
    getrnew();
 
    emitsubflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitSxorVtob(); //S xor overflow
 
  //}ELSE IF (_t==_T_LONG) {
 
#endif
 
  }ELSE errtype(">",_t);
 
  _t = _T_BOOL;
 
}
 
 
 
EXPORT PROC cmdlesseq() //ёЄрЁюх <= эютюую
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION <=" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_FLOAT) {
 
    emitlesseqfloat();
 
  }ELSE IF (_t==_T_BYTE) {
 
    emitlesseqb();
 
  }ELSE IF (_t==_T_UINT) {
 
    emitlesseq();
 
  }ELSE IF (_t==_T_INT) {
 
    emitlesseqsigned();
 
#else
 
  IF (_t==_T_BYTE) {
 
    getrold();
 
    getrnew();
 
    emitsubbflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvcytob();
 
  }ELSE IF (_t==_T_UINT) {
 
    getrold();
 
    getrnew();
 
    emitsubflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvcytob();
 
  }ELSE IF (_t==_T_INT) {
 
    getrold();
 
    getrnew();
 
    emitsubflags(_rold, _rnew); //new-old
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvSxorVtob(); //S xor overflow + шэтхЁёш  Їырур Ёхчєы№ЄрЄр
 
  //}ELSE IF (_t==_T_LONG) {
 
#endif
 
  }ELSE errtype("<=",_t);
 
  _t = _T_BOOL;
 
}
 
 
 
EXPORT PROC cmdmoreeq() //ёЄрЁюх >= эютюую
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION >=" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
#ifdef TARGET_SCRIPT
 
  IF (_t==_T_FLOAT) {
 
    emitmoreeqfloat();
 
  }ELSE IF (_t==_T_BYTE) {
 
    emitmoreeqb();
 
  }ELSE IF (_t==_T_UINT) {
 
    emitmoreeq();
 
  }ELSE IF (_t==_T_INT) {
 
    emitmoreeqsigned();
 
#else
 
  IF (_t==_T_BYTE) {
 
    getrnew();
 
    getrold();
 
    emitsubbflags(_rnew, _rold); //old-new
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvcytob();
 
  }ELSE IF (_t==_T_UINT) {
 
    getrnew();
 
    getrold();
 
    emitsubflags(_rnew, _rold); //old-new
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvcytob();
 
  }ELSE IF (_t==_T_INT) {
 
    getrnew();
 
    getrold();
 
    emitsubflags(_rnew, _rold); //old-new
 
    freernew();
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvSxorVtob(); //S xor overflow + шэтхЁёш  Їырур Ёхчєы№ЄрЄр
 
  //}ELSE IF (_t==_T_LONG) {
 
#endif
 
  }ELSE errtype(">=",_t);
 
  _t = _T_BOOL;
 
}
 
 
 
EXPORT PROC cmdeq()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION ==" ); endcmt();
 
#endif
 
  _sz = _typesz[_t];
 
#ifdef TARGET_SCRIPT
 
  IF (_wasconst) pushconst();
 
  IF (_t==_T_FLOAT) {
 
    emiteqfloat();
 
  }ELSE
 
#endif
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    IF (_wasconst) {
 
      emitsubbzconst(); //new-<const>
 
      _wasconst = +FALSE;
 
    }ELSE {
 
      getrold();
 
      emitsubbz(); //old-new
 
      freernew();
 
    };
 
    freernew();
 
    getrfree(); //_rnew
 
    emitztob();
 
  }ELSE {
 
    IF (_wasconst) pushconst();
 
    IF (_sz==_SZ_REG) {
 
      getrnew();
 
      getrold();
 
      emitsubz(); //old-new
 
      freernew();
 
      freernew();
 
      getrfree(); //_rnew
 
      emitztob();
 
    }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
      getrold2(); _rold2 = _rold; //oldlow //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrold3(); _rold3 = _rold; //oldhigh шч ёЄхър //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newlow
 
      getrold(); //newhigh
 
      emitsublongz(); //old2-new, old3-old
 
      freernew();
 
      freernew();
 
      freernew();
 
      freernew();
 
      getrfree(); //_rnew
 
      emitztob();
 
    };//ELSE errtype("==",_t); //яю шфхх эшъюуфр
 
  };
 
  _t = _T_BOOL;
 
}
 
 
 
EXPORT PROC cmdnoteq()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";OPERATION !=" ); endcmt();
 
#endif
 
  _sz = _typesz[_t];
 
#ifdef TARGET_SCRIPT
 
  IF (_wasconst) pushconst();
 
  IF (_t==_T_FLOAT) {
 
    emitneqfloat();
 
  }ELSE
 
#endif
 
  IF (_sz==_SZ_BYTE) {
 
    getrnew();
 
    IF (_wasconst) {
 
      emitsubbzconst(); //new-<const>
 
      _wasconst = +FALSE;
 
    }ELSE {
 
      getrold();
 
      emitsubbz(); //old-new
 
      freernew();
 
    };
 
    freernew();
 
    getrfree(); //_rnew
 
    emitinvztob();
 
  }ELSE {
 
    IF (_wasconst) pushconst();
 
    IF (_sz==_SZ_REG) {
 
      getrnew();
 
      getrold();
 
      emitsubz(); //old-new
 
      freernew();
 
      freernew();
 
      getrfree(); //_rnew
 
      emitinvztob();
 
    }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
      getrold2(); _rold2 = _rold; //oldlow //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrold3(); _rold3 = _rold; //oldhigh шч ёЄхър //схЁ╕ь Ёрэ№°х, ўЄюс√ яюыєўшЄ№ с√ёЄЁ√щ ЁхушёЄЁ
 
      getrnew(); //newlow
 
      getrold(); //newhigh
 
      emitsublongz(); //old2-new, old3-old
 
      freernew();
 
      freernew();
 
      freernew();
 
      freernew();
 
      getrfree(); //_rnew
 
      emitinvztob();
 
    };//ELSE errtype("!=",_t); //яю шфхх эшъюуфр
 
  };
 
  _t = _T_BOOL;
 
}
 
 
 
///////////////////////////////////
 
//ухэхЁрЎш  т√чютют ш яхЁхїюфют
 
 
 
EXPORT PROC cmdlabel()
 
{
 
  //IF (_wasconst) pushconst(); //т√ўшёыхэшх чръюэўхэю
 
  //эр ¤ЄюЄ ьюьхэЄ фы  яЁхфёърчєхьюёЄш тёх ЁхушёЄЁ√ фюыцэ√ с√Є№ ётюсюфэ√
 
  //(ёхщўрё ¤Єю яюыєўшЄё  ртЄюьрЄшўхёъш, эю схч storergs ш ё ЁхчхЁтшЁютрэшхь ЁхушёЄЁют эрфю юётюсюцфрЄ№ тЁєўэє■)
 
  getnothing();
 
  emitfunclabel(_joined);
 
}
 
 
 
EXPORT PROC cmdjpval()
 
{
 
  //IF (_wasconst) pushconst();
 
  getmainrg();
 
  freernew();
 
  emitjpmainrg(); //"jp (hl)" //фхырхЄ getnothing
 
}
 
 
 
EXPORT PROC cmdcallval()
 
{
 
  IF (_wasconst) pushconst();
 
  getmainrg();
 
  freernew();
 
  emitcallmainrg(); //"call (hl)" //фхырхЄ getnothing //todo трЁшрэЄ ё ъюэёЄрэЄющ
 
}
 
 
 
EXPORT PROC cmdjp()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";JUMP " ); cmtstr(_joined); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  emitjp();
 
}
 
 
 
EXPORT PROC cmdjpiffalse()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";JUMP IF FALSE " ); cmtstr(_joined); endcmt();
 
#endif
 
  IF (_wasconst) pushconst(); //ьюцхЄ с√Є№ эх яЁшётюхэю т IF (+TRUE)
 
  getrnew();
 
  emitbtoz();
 
  freernew();
 
  emitjpiffalse();
 
}
 
 
 
EXPORT PROC cmdcall()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";CALL " ); cmtstr(_callee); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  unproxy();
 
  getnothing(); //ёюїЁрэшЄ№ ЁхушёЄЁ√ т ёЄхъх т ёЄрэфрЁЄэюь яюЁ фъх ш юётюсюфшЄ№ ЁхушёЄЁ√
 
  emitcallproc();
 
  IF (_t!=_T_PROC) {
 
    _sz = _typesz[_t];
 
    IF (_sz==_SZ_BYTE/**(_t==_T_BYTE)||(_t==_T_CHAR)||(_t==_T_BOOL)*/) {
 
      setmainb(); //Ёхчєы№ЄрЄ т RMAIN
 
    }ELSE IF (_sz==_SZ_REG/**(_t==_T_INT)||(_t==_T_UINT)||(_t>=_T_POI)*/) {
 
      setmainrg(); //Ёхчєы№ЄрЄ т RMAIN
 
    }ELSE IF (_sz==_SZ_LONG/**_t==_T_LONG*/) {
 
      setmain2rgs(); //Ёхчєы№ЄрЄ т RMAIN,RMAIN2
 
    }ELSE errtype("call",_t); //яю шфхх эшъюуфр
 
  };
 
}
 
 
 
EXPORT PROC cmdfunc()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";FUNC" ); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  _funcstkdepth = +0;
 
  emitfunchead();
 
}
 
 
 
EXPORT PROC cmdstorergs() //яюёых ёюїЁрэхэш  ыюъры№эющ яхЁхьхээющ ЁхъєЁёштэющ яЁюЎхфєЁ√
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";STOREREGS"); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  getnothing(); //ўЄюс√ шёяюы№чютрЄ№ hl //todo єсЁрЄ№ (ъюуфр сєфхЄ ЁхчхЁтшЁютрэшх ЁхушёЄЁют) - Єюуфр ыюъры№э√х ярЁрьхЄЁ√ сєфєЄ эх т ёЄхъх, р т ЁхушёЄЁрї
 
}
 
 
 
EXPORT PROC cmdpushpar() //фы  ЁхъєЁёштэ√ї яЁюЎхфєЁ (ёюїЁрэхэшх ярЁрьхЄЁют тэєЄЁш шыш ёэрЁєцш)
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";PUSHPAR "); cmtstr(_joined); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getnothing(); //ўЄюс√ шёяюы№чютрЄ№ A //todo єсЁрЄ№ (ъюуфр сєфхЄ ЁхчхЁтшЁютрэшх ЁхушёЄЁют) - Єюуфр ыюъры№э√х ярЁрьхЄЁ√ сєфєЄ эх т ёЄхъх, р т ЁхушёЄЁрї
 
    getrfree(); //_rnew
 
    emitgetb(); //cmdpushvarb(s); //эхт√уюфэю, їюЄ  чрьхэ хЄ тё╕ т√°хэряшёрээюх
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getnothing(); //ўЄюс√ шёяюы№чютрЄ№ hl //todo єсЁрЄ№ (ъюуфр сєфхЄ ЁхчхЁтшЁютрэшх ЁхушёЄЁют) - Єюуфр ыюъры№э√х ярЁрьхЄЁ√ сєфєЄ эх т ёЄхъх, р т ЁхушёЄЁрї
 
    getrfree(); //_rnew
 
    emitgetrg(+FALSE);
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getnothing(); //ўЄюс√ шёяюы№чютрЄ№ hl //todo єсЁрЄ№ (ъюуфр сєфхЄ ЁхчхЁтшЁютрэшх ЁхушёЄЁют) - Єюуфр ыюъры№э√х ярЁрьхЄЁ√ сєфєЄ эх т ёЄхъх, р т ЁхушёЄЁрї
 
    getrfree(); //_rnew
 
    emitgetrg(+TRUE); //high
 
    getnothing(); //ўЄюс√ шёяюы№чютрЄ№ hl //todo єсЁрЄ№ (ъюуфр сєфхЄ ЁхчхЁтшЁютрэшх ЁхушёЄЁют) - Єюуфр ыюъры№э√х ярЁрьхЄЁ√ сєфєЄ эх т ёЄхъх, р т ЁхушёЄЁрї
 
    getrfree(); //_rnew
 
    emitgetrg(+FALSE); //low
 
  };//ELSE errtype("pushpar",_t); //яю шфхх эшъюуфр
 
}
 
 
 
EXPORT PROC cmdpoppar() //фы  ЁхъєЁёштэ√ї яЁюЎхфєЁ (тюёёЄрэютыхэшх ярЁрьхЄЁют тэєЄЁш шыш ёэрЁєцш)
 
{ //ьюцхЄ с√Є№ чрэ Єю 1-2 ЁхушёЄЁр (Ёхчєы№ЄрЄ)
 
#ifdef USE_COMMENTS
 
;;  cmtstr(";POPPAR"); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
    getrfree(); //_rnew
 
    emitpoprg(_rnew);
 
    emitputb();
 
    freernew();
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getrfree(); //_rnew
 
    emitpoprg(_rnew);
 
    emitputrg(+FALSE); //low
 
    freernew();
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getrfree(); //_rnew
 
    emitpoprg(_rnew);
 
    emitputrg(+FALSE); //low
 
    freernew();
 
    getrfree(); //_rnew
 
    emitpoprg(_rnew);
 
    emitputrg(+TRUE); //high
 
    freernew();
 
  };//ELSE errtype("poppar",_t); //яю шфхх эшъюуфр
 
} //ЄхяхЁ№ т ЁхушёЄЁрї ьюцхЄ с√Є№ яєёЄю, тё╕ т ёЄхъх (яхЁхф ret эрфю чрсЁрЄ№ Ёхчєы№ЄрЄ шч ёЄхър)
 
 
 
EXPORT PROC cmdresult()
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";RESULT" ); endcmt();
 
#endif
 
  IF (_wasconst) pushconst();
 
  _sz = _typesz[_t];
 
  IF (_sz==_SZ_BYTE) {
 
  }ELSE IF (_sz==_SZ_REG) {
 
    getmainrg(); //todo ЁхчхЁтшЁютрЄ№ ё яхЁхёЄрэютъющ ЁхушёЄЁют
 
  }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
    getmain2rgs(); //todo ЁхчхЁтшЁютрЄ№ ё яхЁхёЄрэютъющ ЁхушёЄЁют
 
  };//ELSE errtype("result",_t); //яю шфхх эшъюуфр
 
}
 
 
 
EXPORT PROC cmdret(BOOL isfunc)
 
{
 
#ifdef USE_COMMENTS
 
;;  cmtstr( ";ENDFUNC" ); endcmt();
 
#endif
 
  //IF (_wasconst) pushconst();
 
  IF ( isfunc ) {
 
    _sz = _typesz[_t];
 
    IF (_sz==_SZ_BYTE) {
 
      getrnew();
 
      proxy(_rnew);
 
    }ELSE IF (_sz==_SZ_REG) {
 
      getmainrg();
 
    }ELSE /**IF (_sz==_SZ_LONG)*/ {
 
      getmain2rgs();
 
    };//ELSE errtype("endfunc",_t); //яю шфхх эшъюуфр
 
  };
 
  emitret();
 
  IF ((UINT)_funcstkdepth!=0) { errstr("funcstkdepth=" ); erruint((UINT)_funcstkdepth); enderr(); };
 
  initrgs();
 
}
 
 
 
EXPORT PROC initcmd()
 
{
 
  _const  = (PCHAR)_sc;
 
  //_wastword  = (PCHAR)_sw;
 
  _wasconst = +FALSE;
 
}