//ЄюъхэшчрЄюЁ эх чэрхЄ ъюф√ ъюьрэф
 
//ЄюъхэшчрЄюЁ эх яюфуы ф√трхЄ тяхЁ╕ф ш эх юЄьрЄ√трхЄ эрчрф
 
//_asmwaseol ухэхЁшЁєхЄё  т asmrdword_tokspc(), р eol т√тюфшЄё  яюёых ъюьрэф√
 
 
 
//// imported
 
#include "../_sdk/str.h"
 
#include "../_sdk/io.h"
 
 
 
VAR UINT _curlnbeg; //эюьхЁ ёЄЁюъш эр ьюьхэЄ эрўрыр Єюъхэр //фы  read, emit
 
VAR BOOL _cmts; //фы  read, emit
 
 
 
CONST BOOL _isalphanum[256];
 
VAR CHAR txt_low[10];
 
 
 
EXTERN PCHAR _tword; //Єхъє∙хх ёыютю
 
EXTERN UINT _lentword;
 
//EXTERN CHAR _s0[_STRLEN]; //Єхъє∙хх ёыютю
 
 
 
EXTERN BOOL _waseof;
 
EXTERN PBYTE _fin;
 
EXTERN PBYTE _fout;
 
FUNC BYTE readfin FORWARD();
 
 
 
EXTERN UINT _curline; //Єхъє∙шщ эюьхЁ ёЄЁюъш
 
EXTERN UINT _waseols; //ўшёыю EOL ё яЁю°ыюую Ёрчр
 
EXTERN UINT _spcsize; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
 
EXTERN CHAR _cnext;
 
 
 
FUNC UINT stradd FORWARD(PCHAR s, UINT len, CHAR c);
 
FUNC BOOL strcplow FORWARD(PCHAR s1, PCHAR s2);
 
 
 
PROC rdchcmt FORWARD();
 
PROC rdch FORWARD();
 
PROC rdquotes FORWARD(CHAR eol);
 
PROC initrd FORWARD();
 
 
 
CONST BYTE _ASMMAXSPC;
 
 
 
PROC tokpre FORWARD(); //чряюыэшЄ№ ЄрсышЎє ьхЄюъ
 
 
 
////
 
VAR CHAR _c1small;
 
VAR CHAR _c2small;
 
VAR BOOL _asmwaseof;
 
VAR UINT _asmwaseols; //ўшёыю EOL ё яЁю°ыюую Ёрчр
 
VAR UINT _asmspcsize;
 
 
 
VAR CHAR _stokfn[_STRLEN]; //Єхъє∙хх ёыютю
 
VAR PCHAR _tokfn; //Єхъє∙хх ёыютю
 
VAR UINT _lentokfn;
 
 
 
VAR BYTE _temppar;
 
 
 
#define _TOKLBLBUFSIZE 0x1200
 
VAR UINT _toklblbuffreestart; //[1];
 
//VAR UINT _tokoldlblbuffreestart; //[1];
 
CONST UINT _TOKLBLBUFEOF = 0xffff;
 
//CONST UINT _TOKLBLBUFMAXSHIFT  = 0x1fb0/**(_LBLBUFSIZE-0x0100)*/; //0x3f00
 
#define _TOKLBLBUFMAXSHIFT (UINT)(_TOKLBLBUFSIZE-_STRLEN-10)
 
//todo фшэрьшўхёъш т√фхышЄ№
 
VAR UINT _toklblshift[0x100];
 
//VAR UINT _tokoldlblshift[0x100];
 
VAR BYTE _toklbls[_TOKLBLBUFSIZE]; //0x4000
 
VAR BYTE _toklblhash;
 
 
 
PROC rdaddwordall() //яюфъыхшЄ№ ёыхфє■∙є■ ъюьрэфє ъ Єхъє∙хщ
 
{
 
  _spcsize = 0; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
 
  _waseols = 0;
 
  _curlnbeg = _curline;
 
 
 
  IF (_isalphanum[(BYTE)_cnext] ) { //ёыютю ё ЎшЇЁюсєът√
 
    REPEAT { //цф╕ь эхЎшЇЁюсєътє (EOF эх ЎшЇЁюсєътр)
 
      IF (_lentword < _STRMAX) { //т рёьх шч ъюьяшы ЄюЁр тёх ёыютр ъюЁюўх, эю эх т Ёєўэюь рёьх
 
        _tword[_lentword] = _cnext;
 
        INC _lentword;
 
      };
 
      _cnext = (CHAR)readfin();
 
    }UNTIL (!_isalphanum[(BYTE)_cnext]/** || _waseof*/ );
 
  }ELSE { //ёыютю шч эхЎшЇЁюсєътхээюую ёшьтюыр - ўшЄрхь юфэє эхЎшЇЁюсєътє (шэрўх с√ эх ўшЄрыш)
 
    //rdch(); //ўшЄрхь тё■ уЁєяяє фшхЁхчшёют + ёшьтюы ъръ юфшэ ёшьтюы
 
    IF (_lentword < _STRMAX) { //т рёьх шч ъюьяшы ЄюЁр тёх ёыютр ъюЁюўх, эю эх т Ёєўэюь рёьх
 
      _tword[_lentword] = _cnext;
 
      INC _lentword;
 
    };
 
    _cnext = (CHAR)readfin();
 
  }; //эхы№ч  яюфъыхшЄ№ ¤Єю єёыютшх ъ Ўшъыє, Є.ъ. юэю фы  шчэрўры№эюую cnext ш юфшэ Ёрч
 
 
 
  goto loopgo;
 
  loop: //REPEAT { //цф╕ь эхфшхЁхчшё шыш EOF
 
    _cnext = (CHAR)readfin();
 
  loopgo:
 
    IF ((BYTE)_cnext < (BYTE)'!') { //єёъюЁхэшх т√їюфр
 
      INC _spcsize; //spaces after tword
 
      IF ((BYTE)_cnext == 0x0a) {
 
        INC _curline;
 
        _spcsize = 0;
 
        INC _waseols;
 
      }ELSE IF ((BYTE)_cnext == 0x09) {
 
        _spcsize = _spcsize + 7;
 
      };
 
      IF (!_waseof) goto loop;
 
    };
 
  //}UNTIL (_wasdieresis || _waseof );
 
  _tword[_lentword] = '\0';
 
}
 
/**
 
PROC rdwordall()
 
//ўшЄрхь ёыютю _tword (шч ЄхъёЄр ё фшхЁхчшёрьш тьхёЄю яЁюсхыют, хэЄхЁют, Єрсєы Ўшщ)
 
//ёыютю чрърэўштрхЄё , ъюуфр фшхЁхчшё шыш эхЎшЇЁюсєътхээ√щ ёшьтюы (юэ яюярф╕Є т cnext, р ъєЁёюЁ т Їрщых яюёых эхую)
 
{
 
  _lentword = 0; //strclear(_tword); //todo эрЁє°хэр ярЁэюёЄ№ clear..close
 
  rdaddwordall();
 
}
 
*/
 
//////////////////
 
 
 
PROC asmtoken(BYTE token)
 
{
 
  writebyte(_fout, token);
 
}
 
 
 
PROC tokspc()
 
{
 
//IF (!_waseol) { //уы■ъ эр ъюьрэфрї шч юфэюую ёыютр
 
  WHILE (_asmspcsize > (UINT)_ASMMAXSPC) { //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
 
    asmtoken(+_TOKSPC0+_ASMMAXSPC);
 
    _asmspcsize = _asmspcsize - (UINT)_ASMMAXSPC;
 
  };
 
  IF (_asmspcsize!=0) asmtoken(+_TOKSPC0 + (BYTE)_asmspcsize);
 
//};
 
}
 
 
 
PROC asmrdword_tokspc() //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ ъюьрэф√ ш ўшЄрхЄ эютє■
 
//todo т√фртрЄ№ eol ъръ ъюьрэфє?
 
{
 
  _asmwaseof = _waseof;
 
  _asmwaseols = _waseols;
 
  _asmspcsize = _spcsize; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
 
  IF (_waseols==0) tokspc(); //ЄюъхэшчшЁєхь яЁюсхы√ яюёых яЁю°ыющ ъюьрэф√ (шэрўх юЄъырф√трхь эр яюёых eol)
 
  //rdwordall();
 
  _lentword = 0/**strclear(_tword)*/; //todo эрЁє°хэр ярЁэюёЄ№ clear..close
 
  rdaddwordall();
 
  _c1small = (CHAR)((BYTE)(*(PCHAR)_tword)|0x20);
 
  _c2small = (CHAR)((BYTE)_tword[1]|0x20);
 
}
 
 
 
PROC toktext() //ухэхЁшЁєхЄ <text>text<endtext>
 
{
 
  asmtoken(+_TOKTEXT);
 
  asmtoken(+_TOKENDTEXT);
 
}
 
 
 
//ёухэхЁшЁютрЄ№ Єюъхэ ю°шсъш ё ЄхъёЄрьш юЄё■фр фю ъюэЎр шэёЄЁєъЎшш/ёЄЁюъш (тъы■ўр  _tword)
 
//тъы■ўр  яюёыхфэ■■ ъюьрэфє т ёЄЁюъх, ъюЄюЁр  ё waseol шыш ъюЄюЁр  ':'
 
PROC tokerr(BYTE token)
 
{
 
  asmtoken(+_ERR);
 
  asmtoken(token);
 
  WHILE (+TRUE) {
 
    toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
    IF ((_waseols!=0)||(_waseof)||(*(PCHAR)_tword==':')) BREAK;
 
    asmrdword_tokspc();
 
  }; //TODO т юфэє ёЄЁюъє
 
  asmtoken(+_TOKENDERR);
 
  asmrdword_tokspc(); //[ЄюъхэшчшЁєхЄ ъюэхўэ√х яЁюсхы√ шыш EOL,] схЁ╕Є ёыхфє■∙є■ ъюьрэфє (яюёых шэёЄЁєъЎшш)
 
  //todo asmfmt_err?
 
}
 
 
 
//ёухэхЁшЁютрЄ№ Єюъхэ ю°шсъш ё ЄхъёЄюь юЄё■фр фю ъюэЎр ёЄЁюъш (тъы■ўр  _tword)
 
//шыш фю ъюэЎр ъюьрэф√???
 
PROC tokerrcmd()
 
{
 
  tokerr(+_ERRCMD); //todo ёфхырЄ№ asmcmd_err...asmfmt_err тюъЁєу?
 
}
 
 
 
PROC tokinitlblbuf()
 
{
 
  _toklblhash = 0x00;
 
  REPEAT {
 
    _toklblshift[_toklblhash] = _TOKLBLBUFEOF;
 
    INC _toklblhash;
 
  }UNTIL (_toklblhash == 0x00);
 
  _toklblbuffreestart = 0;
 
};
 
 
 
PROC tokcalllbl()
 
{
 
VAR PBYTE plbl; //ьхЄър т ЄрсышЎх чрърэўштрхЄё  эєы╕ь
 
//VAR PBYTE pstr; //ьхЄър т ёЄЁюъх чрърэўштрхЄё  эєы╕ь
 
//VAR BYTE cstr; //ёшьтюы шч ёЄЁюъш
 
//VAR BYTE clbl; //ёшьтюы шч ЄрсышЎ√ ьхЄюъ
 
//VAR BOOL res;
 
VAR UINT plbl_idx;
 
VAR PBYTE calladdr;
 
  //res = +FALSE;
 
  _toklblhash = (BYTE)hash((PBYTE)_tword);
 
 
 
  plbl_idx = _toklblshift[_toklblhash];
 
  WHILE (plbl_idx != _TOKLBLBUFEOF) { //яюър Ўхяюўър ьхЄюъ эх чръюэўшырё№
 
    plbl = &_toklbls[plbl_idx];
 
    plbl_idx = *(PUINT)(plbl);
 
    plbl = &plbl[+sizeof(UINT)/**+1*/]; //skip string size
 
    IF (strcp((PCHAR)_tword, (PCHAR)plbl)) { //ьхЄър эрщфхэр
 
      plbl = &plbl[10/**_lenname+1*/];
 
      calladdr = (PBYTE)*(PLONG)(plbl); //todo PPOI
 
      plbl = &plbl[+sizeof(LONG)]; //todo POI
 
      _temppar = *(PBYTE)(plbl);
 
      //INC plbl;
 
      CALL (calladdr);
 
      //res = +TRUE;
 
      //BREAK;
 
      goto e;
 
    };
 
  };
 
  tokerrcmd(); //not found
 
  e: ; //RETURN res;
 
//asmtoken(0xfd);
 
}
 
 
 
PROC tokaddlbl1(PCHAR txt, PBYTE proc, BYTE data)
 
{
 
VAR PBYTE plbl;
 
//VAR UINT freestart_idx;
 
//VAR UINT plbl_idx;
 
  _toklblhash = (BYTE)hash((PBYTE)txt);
 
 
 
  //ьхЄъш эхЄ: яш°хь т эрўрыю Ўхяюўъш рфЁхё ъюэЎр ёЄЁрэшЎ√ ш ёючфр╕ь ьхЄъє Єрь ёю ёё√ыъющ эр ёЄрЁюх эрўрыю Ўхяюўъш
 
  //freestart_idx = _toklblbuffreestart; //[0] //эрўрыю ётюсюфэюую ьхёЄр
 
  //plbl_idx = _toklblbuffreestart; //[0] //freestart_idx; //єърчрЄхы№ эр эрўрыю фрээ√ї ёючфртрхьющ ьхЄъш (эрфю юс чрЄхы№эю чряюьэшЄ№!) //эрўрыю ётюсюфэюую ьхёЄр
 
  plbl = &_toklbls[_toklblbuffreestart]; //[0] [plbl_idx]; //єърчрЄхы№ эр эрўрыю ёючфртрхьющ ьхЄъш //эрўрыю ётюсюфэюую ьхёЄр
 
  //яш°хь ьхЄъє
 
  POKE *(PUINT)(plbl) = _toklblshift[_toklblhash]; //ёЄрЁ√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
 
  _toklblshift[_toklblhash] = _toklblbuffreestart; //[0] //freestart_idx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш //эрўрыю ётюсюфэюую ьхёЄр
 
  plbl = &plbl[+sizeof(UINT)];
 
  //POKE *(PBYTE)(plbl) = (BYTE)10/**(BYTE)_lenname*/;
 
  //INC plbl;
 
  strcopy(txt, 9/**_lenname*/, (PCHAR)plbl);
 
  plbl = &plbl[10/**_lenname+1*/];
 
  POKE *(PLONG)(plbl) = (LONG)proc; //todo PPOI
 
  plbl = &plbl[+sizeof(LONG)]; //todo POI
 
  POKE *(PBYTE)(plbl) = data;
 
  //INC plbl;
 
  //plbl_idx = (UINT)(plbl - _toklbls); //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш
 
  //_toklblshift[_toklblhash] = freestart_idx; //эют√щ єърчрЄхы№ эр эрўрыю Ўхяюўъш
 
  //_toklblbuflen = _toklblbuflen + plbl_idx - freestart_idx;
 
  _toklblbuffreestart = (UINT)(plbl - _toklbls) + 1; //єърчрЄхы№ ъюэхЎ ёючфртрхьющ ьхЄъш //plbl_idx; /**[0]*/
 
  //INC _toklblcount;
 
}
 
 
 
PROC stringdecapitalize(PCHAR s1, PCHAR s2)
 
{
 
VAR CHAR c;
 
  loop:
 
    c = *(PCHAR)s1;
 
    IF (((BYTE)c>=(BYTE)'A') && ((BYTE)c<=(BYTE)'Z')) {
 
      c = (CHAR)((BYTE)c | 0x20);
 
    };
 
    POKE *(PCHAR)(s2) = c;
 
    INC s1;
 
    INC s2;
 
    IF (c != '\0') goto loop;
 
}
 
 
 
PROC tokaddlbl(PCHAR txt, PBYTE proc, BYTE data)
 
{
 
  tokaddlbl1(txt, proc, data);
 
  stringdecapitalize(txt, txt_low);
 
  tokaddlbl1(txt_low, proc, data);
 
}
 
 
 
//////////////////////////////////////
 
//хёыш match ёЁрсюЄры, Єю _tword ё·хфрхЄё  (ўшЄрхЄё  ёыхфє■∙р ) ш т√тюфшЄё  ёююЄтхЄёЄтє■∙шщ Єюъхэ
 
//хёыш эх ёЁрсюЄры, Єю _tword эх ё·хфрхЄё , ю°шсър эх т√фр╕Єё  (Єюы№ъю Їыру +FALSE)
 
//хёыш ю°шсър, Єю ю°шсър эх т√фр╕Єё  (Єюы№ъю Їыру +FALSE)
 
 
 
    //reg ш rp ьюуєЄ тёЄЁхЄшЄ№ё  т юфэющ яючшЎшш т inc,dec,[ld],[add],[adc],[sbc]
 
    //шэрўх ышсю reg (b,c,d,e,h,l,a,hx,lx,hy,ly, эю эх i,r!), ышсю rp (bc,de,hl,sp,ix,iy, эю эх af!)
 
    //i,r ш af юсЁрсрЄ√трЄ№ юЄфхы№эю, Є.ъ. эрфю Єюы№ъю фы  эхъюЄюЁ√ї ъюьрэф, юёЄры№э√х ъюьрэф√ эх фюыцэ√ яЁютхЁ Є№ ¤Єє ю°шсъє яЁш ёрьющ ъюьяшы Ўшш
 
 
 
FUNC BOOL matchdirect()
 
{
 
VAR BOOL ok;
 
  IF (*(PCHAR)_tword=='#') {
 
    asmtoken(+_TOKDIRECT);
 
    asmrdword_tokspc();
 
    ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchcomma()
 
{
 
VAR BOOL ok;
 
  IF (*(PCHAR)_tword==',') {
 
    asmtoken(+_TOKCOMMA);
 
    asmrdword_tokspc();
 
    ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchprime()
 
{
 
VAR BOOL ok;
 
  IF (*(PCHAR)_tword=='\'') {
 
    asmtoken(+_TOKPRIMESYM);
 
    asmrdword_tokspc();
 
    ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchquote()
 
{
 
VAR BOOL ok;
 
  IF (*(PCHAR)_tword=='\"') {
 
    asmtoken(+_TOKDBLQUOTESYM);
 
    //asmrdword_tokspc();
 
    ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchreequ()
 
{
 
VAR BOOL ok;
 
  IF ( (*(PCHAR)_tword=='=') || ((_c1small=='e')&&(_c2small=='q')) ) {
 
    asmtoken(+_TOKEQUAL/**'='*/);
 
    asmrdword_tokspc();
 
    ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchopen()
 
{
 
VAR BOOL ok;
 
  IF       (*(PCHAR)_tword=='(') {asmtoken(+_TOKOPEN); asmrdword_tokspc(); ok = +TRUE;
 
  }ELSE IF (*(PCHAR)_tword=='[') {asmtoken(+_TOKOPENSQ); asmrdword_tokspc(); ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
FUNC BOOL matchclose()
 
{
 
VAR BOOL ok;
 
  IF       (*(PCHAR)_tword==')') {asmtoken(+_TOKCLOSE); asmrdword_tokspc(); ok = +TRUE;
 
  }ELSE IF (*(PCHAR)_tword==']') {asmtoken(+_TOKCLOSESQ); asmrdword_tokspc(); ok = +TRUE;
 
  }ELSE ok = +FALSE;
 
RETURN ok;
 
}
 
 
 
//////////////////////////////////////
 
FUNC BOOL tokexpr RECURSIVE FORWARD();
 
 
 
PROC eatlabel(BYTE token)
 
{
 
  WHILE ((_cnext=='.')||(_cnext=='#')) {
 
    rdaddwordall(); //яЁшъыхшЄ№ Єюўъє
 
    IF (_spcsize==0)
 
      IF (_isalphanum[(BYTE)_cnext]) //с√ыю isalpha
 
        IF (_waseols==0)
 
          //IF (!_waseof)
 
            rdaddwordall(); //яЁшъыхшЄ№ ёыхфє■∙хх ёыютю
 
  };
 
  asmtoken(token/**_TOKLABEL шыш _CMDLABEL*/);
 
  asmtoken(+_TOKTEXT);
 
  asmtoken(+_TOKENDTEXT);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  //хёыш ьхЄър с√ыр яюёыхфэшь ёыютюь т ёЄЁюъх, Єюуфр ¤Єющ ЄюъхэшчрЎшхщ ь√ чрс√ыш с√ яЁю хэЄхЁ (юэ ЄхяхЁ№ т _asmwaseol)
 
}
 
 
 
PROC eatval RECURSIVE() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш  (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
 
//<val>::=
 
//(<expr>) //т√Ёрцхэшх (т√ўшёы хЄё )
 
//|<num> //фхё Єшўэюх ўшёыю (яхЁхфр╕Єё  Ўхышъюь)
 
//|<var> //ьхЄър шыш ярЁрьхЄЁ ьръЁюёр (TODO эх ёююЄтхЄёЄтєхЄ  ч√ъє: Єрь ¤Єю &<var>)
 
//|$
 
//|'CHAR' //ёшьтюы№эр  ъюэёЄрэЄр
 
//|-<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ NEG
 
//|+<val> //т√ўшёышЄ№ val
 
//|~<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV
 
//|!<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV(BOOL)
 
//|*<val> //яЁюўшЄрЄ№ ярь Є№ яю рфЁхёє (т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ PEEK)
 
{ //ъюьрэфр єцх яЁюўшЄрэр
 
VAR CHAR opsym;
 
{
 
  opsym = *(PCHAR)_tword;
 
  IF (!_asmwaseof) { //чр∙шЄр юЄ чрЎшъыштрэш  т ъюэЎх ю°шсюўэюую Їрщыр
 
    IF ((BYTE)((BYTE)opsym - (BYTE)'0') < 0x0a) { //<num> //т√фр╕Є <num><text>digits<endtext> //extra BYTE for C bug
 
      asmtoken(+_TOKNUM);
 
      asmtoken(+_TOKTEXT);
 
//for float:
 
      IF (_cnext=='.') {
 
        rdaddwordall(); //яЁшъыхшЄ№ Єюўъє
 
        rdaddwordall(); //яЁшъыхшЄ№ фЁюсэє■ ўрёЄ№
 
        IF ( (_tword[_lentword-1]=='e') && (_cnext=='-') ) {
 
          rdaddwordall(); //яЁшъыхшЄ№ '-' юЄЁшЎрЄхы№эющ ¤ъёяюэхэЄ√
 
          rdaddwordall(); //яЁшъыхшЄ№ юЄЁшЎрЄхы№эє■ ¤ъёяюэхэЄє
 
        };
 
/*        asmrdword_tokspc();
 
        fputs(_tword, _fout);
 
        asmrdword_tokspc();*/ //todo e-12
 
      };
 
      asmtoken(+_TOKENDTEXT);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      //хёыш ўшёыю с√ыю яюёыхфэшь ёыютюь т ёЄЁюъх, Єюуфр ¤Єющ ЄюъхэшчрЎшхщ ь√ чрс√ыш с√ яЁю хэЄхЁ (юэ ЄхяхЁ№ т _asmwaseol)
 
    }ELSE IF (_isalphanum[(BYTE)opsym] || (opsym=='.') ) { //todo єсЁрЄ№ '.', хёыш чряЁхЄшЄ№ эрўшэрЄ№ ьхЄъш ё Єюўъш //с√ыю isalpha
 
      eatlabel(+_TOKLABEL);
 
    }ELSE IF ( opsym=='$' ) {
 
      asmtoken(+_TOKDOLLAR);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
    }ELSE IF ( opsym=='(' ) {
 
      asmtoken(+_TOKOPEN);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      tokexpr(); //ЁхъєЁёш  //эр т√їюфх шч expr єцх яЁюўшЄрэр ')', эю ёыхфє■∙шщ ёшьтюы шыш ъюьрэфр эх яЁюўшЄрэ√
 
      asmtoken(+_TOKCLOSE);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
    }ELSE IF ( opsym=='\'' ) { //todo тёЄртшЄ№ TOK_TEXT...TOK_ENDTEXT
 
      asmtoken(+_TOKPRIME);
 
      _lentword = 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
 
      rdquotes('\''/**, +FALSE*/);
 
      toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
      rdch(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
 
      asmtoken(+_TOKPRIME);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
    }ELSE IF ( opsym=='-' ) {
 
      asmtoken(+_OPPUSH0); asmtoken(+_TOKMINUS/**'-'*/);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      eatval(); //ЁхъєЁёштэ√щ т√чют val
 
      asmtoken(+_OPSUB);
 
    }ELSE IF ( opsym=='+' ) {
 
      asmtoken(+_OPPUSH0); asmtoken(+_TOKPLUS/**'+'*/);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      eatval(); //ЁхъєЁёштэ√щ т√чют val
 
      asmtoken(+_OPADD);
 
    }ELSE IF ( opsym=='*' ) {
 
      asmtoken(+_OPPUSH0); asmtoken(+_TOKSTAR/**'*'*/);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      eatval(); //ЁхъєЁёштэ√щ т√чют val
 
      asmtoken(+_OPPEEK);
 
    }ELSE IF ( opsym=='~' ) {
 
      asmtoken(+_OPPUSH0); asmtoken(+_TOKTILDE);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      eatval(); //ЁхъєЁёштэ√щ т√чют val
 
      asmtoken(+_OPINV);
 
    }ELSE IF ( opsym=='!' ) {
 
      asmtoken(+_OPPUSH0); asmtoken(+_TOKEXCL);
 
      asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
      eatval(); //ЁхъєЁёштэ√щ т√чют val
 
      asmtoken(+_OPINV); //todo BOOL
 
    }ELSE { tokerr(+_ERREXPR);/**errstr( ">>>WRONG PREFIX " ); err( opsym ); enderr();*/ };
 
  };
 
}
 
}
 
 
 
PROC eatmul()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKSTAR/**'*'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPMUL);
 
}
 
 
 
PROC eatdiv()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKSLASH/**'/'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPDIV);
 
}
 
 
 
PROC eatand()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKAND/**'&'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPAND);
 
}
 
 
 
PROC eatandbool()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken(+_TOKAND/**'&'*/); asmtoken(+_TOKAND/**'&'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPAND);
 
}
 
 
 
PROC eatmulval RECURSIVE() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш  (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
 
{ //ъюьрэфр єцх яЁюўшЄрэр
 
VAR CHAR opsym;
 
VAR BOOL dbl;
 
{
 
  eatval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  WHILE ((!_asmwaseof)&&(_asmwaseols==0)) { //єцх яЁюўшЄрэр юяхЁрЎш  ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
 
    opsym=*(PCHAR)_tword;
 
    dbl = (opsym=='&')&&(_cnext==opsym); //C compatibility
 
    IF (dbl) asmrdword_tokspc(); //use '&' //C compatibility
 
    IF       (opsym=='*') {eatmul();
 
    }ELSE IF (opsym=='/') {eatdiv();
 
    }ELSE IF (opsym=='&') {
 
      IF (dbl) {eatandbool();
 
      }ELSE eatand();
 
    }ELSE BREAK;
 
  };
 
}
 
}
 
 
 
PROC eatadd()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKPLUS/**'+'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPADD);
 
}
 
 
 
PROC eatsub()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKMINUS/**'-'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPSUB);
 
}
 
 
 
PROC eator()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKPIPE/**'|'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPOR);
 
}
 
 
 
PROC eatorbool()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken(+_TOKPIPE/**'|'*/); asmtoken(+_TOKPIPE/**'|'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPOR);
 
}
 
 
 
PROC eatxor()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP1);*/ asmtoken(+_TOKCARON/**'^'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPXOR);
 
}
 
 
 
PROC eatxorbool()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken(+_TOKCARON/**'^'*/); asmtoken(+_TOKCARON/**'^'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPXOR);
 
}
 
 
 
PROC eatsumval RECURSIVE() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш  (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
 
{ //ъюьрэфр єцх яЁюўшЄрэр
 
VAR CHAR opsym;
 
VAR BOOL dbl;
 
{
 
  eatmulval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  WHILE ((!_asmwaseof)&&(_asmwaseols==0)) { //єцх яЁюўшЄрэр юяхЁрЎш  ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
 
    opsym=*(PCHAR)_tword;
 
    dbl = ( (opsym=='|')||(opsym=='^') )&&(_cnext==opsym); //C compatibility
 
    IF (dbl) asmrdword_tokspc(); //use '|' or '^' //C compatibility
 
    IF (opsym=='+') {eatadd();
 
    }ELSE IF (opsym=='-') {eatsub();
 
    }ELSE IF (opsym=='|') {
 
      IF (dbl) {eatorbool();
 
      }ELSE eator();
 
    }ELSE IF (opsym=='^') {
 
      IF (dbl) {eatxorbool();
 
      }ELSE eatxor();
 
    }ELSE BREAK;
 
  };
 
}
 
}
 
 
 
PROC eatshl()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken(+_TOKLESS/**'<'*/); asmtoken(+_TOKLESS/**'<'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPSHL);
 
}
 
 
 
PROC eatshr()
 
{
 
  /**asmtoken(_ASMOPPUSHSKIP2);*/ asmtoken(+_TOKMORE/**'>'*/); asmtoken(+_TOKMORE/**'>'*/);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPSHR);
 
}
 
 
 
PROC eatless()
 
{
 
  asmtoken(+_TOKLESS);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPLESS);
 
}
 
 
 
PROC eatlesseq()
 
{
 
  asmtoken(+_TOKLESS); asmtoken(+_TOKEQUAL);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPLESSEQ);
 
}
 
 
 
PROC eatmore()
 
{
 
  asmtoken(+_TOKMORE);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPMORE);
 
}
 
 
 
PROC eatmoreeq()
 
{
 
  asmtoken(+_TOKMORE); asmtoken(+_TOKEQUAL);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPMOREEQ);
 
}
 
 
 
PROC eateq()
 
{
 
  asmtoken(+_TOKEQUAL); asmtoken(+_TOKEQUAL);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPEQ);
 
}
 
 
 
PROC eatnoteq()
 
{
 
  asmtoken(+_TOKEXCL); asmtoken(+_TOKEQUAL);
 
  asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  asmtoken(+_OPNOTEQ);
 
}
 
 
 
FUNC BOOL tokexpr RECURSIVE() //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш  (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
 
{ //ъюьрэфр єцх яЁюўшЄрэр
 
VAR CHAR opsym;
 
VAR BOOL modified;
 
VAR BOOL dbl;
 
//VAR BOOL ok;
 
{
 
  //ok = +TRUE;
 
  matchdirect(); //яЁюяєёъ '#'
 
  eatsumval(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш 
 
  WHILE ((!_asmwaseof)&&(_asmwaseols==0)) { //єцх яЁюўшЄрэр юяхЁрЎш  ш яЁюсхы√-хэЄхЁ√ яюёых эх╕ (_asmwaseol - хэЄхЁ яюёых val)
 
    opsym = *(PCHAR)_tword;
 
    modified = (_cnext=='=');
 
    dbl = (_cnext==opsym);
 
    IF (modified||dbl) asmrdword_tokspc(); //use '=' or '>' or '<'
 
    IF (opsym=='<') {
 
      IF (dbl) {eatshl(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
 
      }ELSE IF (modified) {eatlesseq();
 
      }ELSE {eatless();
 
      };
 
    }ELSE IF (opsym=='>') {
 
      IF (dbl) {eatshr(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
 
      }ELSE IF (modified) {eatmoreeq();
 
      }ELSE {eatmore();
 
      };
 
    }ELSE IF (opsym=='=') {eateq();
 
    }ELSE IF (opsym=='!') {eatnoteq();
 
    }ELSE BREAK;
 
  };
 
  RETURN +TRUE; //ok; //todo err
 
}
 
}
 
 
 
FUNC BOOL tokexpr_close() //яюёых эхую эшўхую сюы№°х эхы№ч  яЁютхЁ Є№, Є.ъ. ъєЁёюЁ ьюу ёфтшэєЄ№ё 
 
{
 
VAR BOOL ok;
 
  ok = tokexpr();
 
  IF (ok) ok = matchclose();
 
  RETURN ok;
 
}
 
 
 
PROC asm_direct_expr_close_token(BYTE token)
 
{
 
  //if(matchdirect()) {
 
    IF (tokexpr()) {
 
      IF (matchclose()) {asmtoken(token);
 
      }ELSE tokerr(+_ERRCLOSE); //no closing bracket
 
    }ELSE tokerr(+_ERREXPR); //wrong expr
 
  //}else tokerr(_ERRPAR); //no direct
 
}
 
 
 
PROC tokcomment()
 
{
 
  asmtoken(+_TOKCOMMENT);
 
  _lentword = 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
 
  IF (_waseols==0) { //юсїюф эр ёыєўрщ ъюэхўэюую ; яхЁхф ъюьрэфющ
 
    WHILE (_spcsize != 0) { //фюсртшЄ№ ё·хфхээ√х яЁюсхы√
 
      _lentword = stradd(_tword, _lentword, ' ');
 
      DEC _spcsize;
 
    };
 
    WHILE (_waseols==0/**&&(!_waseof)*//**&&(_cnext!=_DIERESIS)*/) {
 
      rdchcmt(); //яЁюяєёърхЄ тёх хэЄхЁ√
 
    };
 
  };
 
  _tword[_lentword] = '\0';
 
  toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
  asmtoken(+_TOKENDCOMMENT);
 
  IF ((BYTE)_cnext < (BYTE)'!') {
 
    IF (_cnext == '\t') {
 
      _spcsize = _spcsize + 8;
 
    }ELSE {
 
      INC _spcsize;
 
    };
 
    rdch(); //ўшЄрхь тё■ уЁєяяє фшхЁхчшёют + ёшьтюы ъръ юфшэ ёшьтюы
 
  };
 
  asmrdword_tokspc(); //[ЄюъхэшчшЁєхЄ ъюэхўэ√х яЁюсхы√ шыш EOL,] схЁ╕Є ёыхфє■∙є■ ъюьрэфє (яюёых шэёЄЁєъЎшш)
 
}
 
 
 
PROC tokorg()
 
{
 
  asmtoken(+_CMDORG);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (tokexpr()) {asmtoken(+_FMTCMD);
 
  }ELSE tokerr(+_ERREXPR); //wrong expr
 
}
 
 
 
PROC tokalign()
 
{
 
  asmtoken(+_CMDALIGN);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (tokexpr()) {asmtoken(+_FMTCMD);
 
  }ELSE tokerr(+_ERREXPR); //wrong expr
 
}
 
/**
 
PROC tokpage()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokif()
 
{
 
  asmtoken(+_CMDIF);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (tokexpr()) {asmtoken(+_FMTCMD);
 
  }ELSE tokerr(+_ERREXPR); //wrong expr
 
  //tokerrcmd();
 
}
 
 
 
PROC tokelse()
 
{
 
  asmtoken(+_CMDELSE);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  //tokerrcmd();
 
}
 
 
 
PROC tokendif()
 
{
 
  asmtoken(+_CMDENDIF);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  //tokerrcmd();
 
}
 
 
 
PROC tokdup()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokedup()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokmacro()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokendm()
 
{
 
  tokerrcmd();
 
}
 
*/
 
PROC tokexport()
 
{
 
  asmtoken(+_CMDEXPORT);
 
  asmrdword_tokspc(); //ё·хфрхь call
 
  eatlabel(+_TOKLABEL);
 
  //asmmtoken(+_TOKTEXT);
 
  //fputs(_tword, _fout);
 
  //asmtoken(+_TOKENDTEXT);
 
  //asmrdword_tokspc(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ (юсЁрсюЄрээющ) ъюьрэф√ ш ўшЄрхЄ эютє■
 
  asmtoken(+_FMTCMD); //ўЄюс√ шёяюы№чютрЄ№ label
 
}
 
/**
 
PROC toklocal()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokendl()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokdisp()
 
{
 
  asmtoken(+_CMDDISP);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (tokexpr()) {asmtoken(+_FMTCMD);
 
  }ELSE tokerr(+_ERREXPR); //wrong expr
 
}
 
 
 
PROC tokent()
 
{
 
  asmtoken(+_CMDENT);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  asmtoken(+_FMTCMD);
 
}
 
*/
 
PROC tokinclude()
 
{
 
  asmtoken(+_CMDINCLUDE);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (matchquote()) {
 
    //asmtoken(+_OPWRSTR);
 
    _lentword = 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
 
    rdquotes('\"');
 
    toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
    rdch(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
 
    asmtoken(+_TOKDBLQUOTESYM);
 
    asmrdword_tokspc();
 
  }ELSE tokerr(+_ERREXPR);
 
  //asmtoken(+_FMTCMD); //todo?
 
}
 
 
 
PROC tokincbin()
 
{
 
  asmtoken(+_CMDINCBIN);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  IF (matchquote()) {
 
    //asmtoken(+_OPWRSTR);
 
    _lentword = 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
 
    rdquotes('\"');
 
    toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
    rdch(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
 
    asmtoken(+_TOKDBLQUOTESYM);
 
    asmrdword_tokspc();
 
  }ELSE tokerr(+_ERREXPR);
 
  //todo ярЁрьхЄЁ√ (яЁюяєёъ, фышэр)
 
  //asmtoken(+_FMTCMD); //todo?
 
}
 
 
 
PROC tokdb()
 
{
 
  asmtoken(+_CMDDB);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  REPEAT {
 
    IF (matchquote()) {
 
      asmtoken(+_OPWRSTR);
 
      _lentword = 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
 
      rdquotes('\"');
 
      toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
 
      rdch(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
 
      asmtoken(+_TOKDBLQUOTESYM);
 
      asmrdword_tokspc();
 
    }ELSE IF (tokexpr()) {
 
      asmtoken(+_OPWRVAL);
 
    }ELSE tokerr(+_ERREXPR);
 
  }UNTIL (!matchcomma());
 
  asmtoken(+_FMTCMD);
 
}
 
 
 
PROC tokdw()
 
{
 
  asmtoken(+_CMDDW);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  REPEAT {
 
    tokexpr();
 
    asmtoken(+_OPWRVAL);
 
  }UNTIL (!matchcomma());
 
  asmtoken(+_FMTCMD);
 
}
 
 
 
PROC tokdl()
 
{
 
  asmtoken(+_CMDDL);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  REPEAT {
 
    tokexpr();
 
    asmtoken(+_OPWRVAL);
 
  }UNTIL (!matchcomma());
 
  asmtoken(+_FMTCMD);
 
}
 
 
 
PROC tokds()
 
{
 
  asmtoken(+_CMDDS);
 
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
 
  tokexpr();
 
  WHILE (matchcomma()) {
 
    tokexpr();
 
  };
 
  asmtoken(+_FMTCMD);
 
}
 
/**
 
PROC tokdisplay()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokrepeat()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokuntil()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokstruct()
 
{
 
  tokerrcmd();
 
}
 
 
 
PROC tokendstruct()
 
{
 
  tokerrcmd();
 
}
 
*/
 
PROC tokcolon()
 
{
 
  asmtoken(+_TOKCOLON);
 
  asmrdword_tokspc(); //ё·хфрхь ':'
 
}
 
 
 
///////////////////////
 
 
 
PROC tokcmd()
 
{
 
  //_asmwaseof=_waseof;
 
  //rdword_tokspc(); //яЁюўшЄрэю т яЁхф√фє∙хщ шэёЄЁєъЎшш
 
  //stringdecapitalize(_tword,_lentword);
 
  IF (*(PCHAR)_tword==';') {tokcomment();
 
/**  }ELSE IF (*(PCHAR)_tword==':') {
 
    asmtoken(+_TOKCOLON);
 
    asmrdword_tokspc(); //ё·хфрхь ':'
 
*/
 
  }ELSE IF (_asmspcsize!=0) {
 
    //tokasm(); //assembly mnemonic or directive
 
    tokcalllbl();
 
/**    IF (!tokcalllbl(_tword)) {
 
      tokerrcmd(); //wrong _tword
 
    };*/
 
  }ELSE { //<label> шыш <label>=<expr>
 
    //asmtoken(0xff);
 
    eatlabel(+_CMDLABEL); //ё·хфрхь ьхЄъє
 
    IF (matchreequ()) { //<label>=<expr>
 
      IF (tokexpr()) {
 
        asmtoken(+_FMTREEQU);
 
      }ELSE tokerr(+_ERREXPR); //wrong expr
 
    }ELSE //IF ((_asmwaseols!=0)||(_asmwaseof)||(*(PCHAR)_tword==':')||(*(PCHAR)_tword==';')){ //<label>
 
      asmtoken(+_FMTCMD); //<label>
 
    //}ELSE tokerrcmd(); //wrong _tword
 
  };
 
  //яш°хь eol ш яЁюсхы√, ъюЄюЁ√х эх чряшёрыш яЁш ўЄхэшш ъюэхўэюую ёыютр
 
  IF (_asmwaseols!=0) {
 
    WHILE (_asmwaseols!=0) {
 
      asmtoken(+_TOKEOL);
 
      DEC _asmwaseols;
 
    };
 
    tokspc(); //ЄюъхэшчшЁєхь яЁюсхы√ яюёых
 
  };
 
}
 
 
 
PROC tokinit()
 
{
 
  _tokfn = (PCHAR)_stokfn;
 
  tokinitlblbuf();
 
  tokpre(); //чряюыэшЄ№ ЄрсышЎє ьхЄюъ
 
}
 
 
 
PROC tokenize(PCHAR fn)
 
{
 
VAR UINT i;
 
  _fin = nfopen(fn, "rb");
 
  IF (_fin != (PBYTE)0) {
 
    _waseof = +FALSE;
 
    _curline = 1;
 
    initrd();
 
 
 
    _lentokfn = 0;
 
    i = 0;
 
    WHILE (fn[_lentokfn] != '\0') {
 
      _tokfn[_lentokfn] = fn[_lentokfn];
 
      IF (fn[_lentokfn] == '.') i = _lentokfn;
 
      INC _lentokfn;
 
    };
 
    //_lentokfn = strjoineol(_tokfn, 0, fn, '.'); //terminator is not copied
 
    //_lentokfn = stradd(_tokfn, _lentokfn, '.');
 
    _lentokfn = i+1; //after last dot
 
    _lentokfn = stradd(_tokfn, _lentokfn, (CHAR)((BYTE)fn[_lentokfn]&0xdf));
 
    _lentokfn = stradd(_tokfn, _lentokfn, '_');
 
    _tokfn[_lentokfn] = '\0';
 
    _fout = openwrite(_tokfn);
 
 
 
    _asmwaseols = 0;
 
    _asmwaseof = +FALSE;
 
    asmrdword_tokspc(); //ўшЄрхь яхЁтє■ ъюьрэфє
 
 
 
    WHILE (!_asmwaseof) { //todo шыш endasm ('}')
 
      tokcmd();
 
    };
 
 
 
    asmtoken(+_TOKEOF);
 
    fclose(_fout
); //closewrite(_fout); //closefout();  
 
 
  };
 
}
 
 
 
PROC tokenize_end()
 
{
 
}