Login

Subversion Repositories NedoOS

Rev

Rev 8 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

//// imported
PROC tokaddlbl FORWARD(PCHAR txt, PBYTE proc, BYTE data);

EXTERN PCHAR _tword; //Єхъє∙хх ёыютю
EXTERN UINT _lentword;

EXTERN BYTE _temppar;

PROC asmtoken FORWARD(BYTE token);

PROC tokorg FORWARD();
PROC tokalign FORWARD();
PROC tokpage FORWARD();
PROC tokif FORWARD();
PROC tokelse FORWARD();
PROC tokendif FORWARD();
PROC tokdup FORWARD();
PROC tokedup FORWARD();
PROC tokmacro FORWARD();
PROC tokendm FORWARD();
//PROC tokusemacro FORWARD();
PROC tokexport FORWARD();
PROC toklocal FORWARD();
PROC tokendl FORWARD();
PROC tokdisp FORWARD();
PROC tokent FORWARD();
PROC tokinclude FORWARD();
PROC tokincbin FORWARD();
PROC tokdb FORWARD();
PROC tokdw FORWARD();
PROC tokdl FORWARD();
PROC tokds FORWARD();
PROC tokdisplay FORWARD();
PROC tokrepeat FORWARD();
PROC tokuntil FORWARD();
PROC tokstruct FORWARD();
PROC tokendstruct FORWARD();
PROC tokcomment FORWARD();
PROC tokcolon FORWARD();

EXTERN CHAR _c1small;
EXTERN CHAR _c2small;
EXTERN BOOL _asmwaseof;
EXTERN UINT _asmwaseols;

PROC tokeol FORWARD();
PROC asmrdword_tokspc FORWARD(); //ЄюъхэшчшЁєхЄ яЁюсхы√ яюёых яЁю°ыющ ъюьрэф√ ш ўшЄрхЄ эютє■
PROC toktext FORWARD(); //ухэхЁшЁєхЄ <text>text<endtext>
PROC tokerr FORWARD(BYTE token);
PROC tokerrcmd FORWARD();
FUNC BOOL matchcomma FORWARD();
FUNC BOOL matchprime FORWARD();
FUNC BOOL matchquote FORWARD();
FUNC BOOL matchreequ FORWARD();
FUNC BOOL matchopen FORWARD();
FUNC BOOL matchclose FORWARD();
FUNC BOOL tokexpr FORWARD(); //фюыцхэ ўшЄрЄ№, эю эх ё·хфрЄ№ ёшьтюы ъюэЎр т√Ёрцхэш  (ёъюсър, чря Єр , ъюэхЎ ёЄЁюъш)
FUNC BOOL tokexpr_close FORWARD(); //яюёых эхую эшўхую сюы№°х эхы№ч  яЁютхЁ Є№, Є.ъ. ъєЁёюЁ ьюу ёфтшэєЄ№ё 
PROC asm_direct_expr_close_token FORWARD(BYTE token);

////

FUNC BOOL matchnzzncc()
{
VAR BOOL ok;
  IF       ((_lentword==2)&&(_c1small=='n')&&(_c2small=='z')) {asmtoken(+_ASMNZ); asmrdword_tokspc(); ok = +TRUE;
  }ELSE IF ((_lentword==1)&&(_c1small=='z')                 ) {asmtoken(+_ASMZ); asmrdword_tokspc(); ok = +TRUE;
  }ELSE IF ((_lentword==2)&&(_c1small=='n')&&(_c2small=='c')) {asmtoken(+_ASMNC); asmrdword_tokspc(); ok = +TRUE;
  }ELSE IF ((_lentword==1)&&(_c1small=='c')                 ) {asmtoken(+_ASMC); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchcc()
{
VAR BOOL ok;
  IF (_lentword==1) {
    IF       (_c1small=='z') {asmtoken(+_ASMZ); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='c') {asmtoken(+_ASMC); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='p') {asmtoken(+_ASMP); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='m') {asmtoken(+_ASMM); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE IF (_lentword==2) {
    IF       ((_c1small=='n')&&(_c2small=='z')) {asmtoken(+_ASMNZ); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='n')&&(_c2small=='c')) {asmtoken(+_ASMNC); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='p')&&(_c2small=='o')) {asmtoken(+_ASMPO); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='p')&&(_c2small=='e')) {asmtoken(+_ASMPE); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matcha()
{
VAR BOOL ok;
  IF ((_c1small=='a')&&(_lentword==1)) {
    asmtoken(+_RG_A);  asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchc()
{
VAR BOOL ok;
  IF ((_c1small=='c')&&(_lentword==1)) {
    asmtoken(+_RG_C); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}
/**
FUNC BOOL matchbc()
{
VAR BOOL ok;
  IF ((_c1small=='b')&&(_c2small=='c')&&(_lentword==2)) {
    asmtoken(+_RG_BC); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}
*/

FUNC BOOL matchde()
{
VAR BOOL ok;
  IF ((_c1small=='d')&&(_c2small=='e')&&(_lentword==2)) {
    asmtoken(+_RG_DE); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchhl()
{
VAR BOOL ok;
  IF ((_c1small=='h')&&(_c2small=='l')&&(_lentword==2)) {
    asmtoken(+_RG_HL); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchsp()
{
VAR BOOL ok;
  IF ((_c1small=='s')&&(_c2small=='p')&&(_lentword==2)) {
    asmtoken(+_RG_SP); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchaf()
{
VAR BOOL ok;
  IF ((_c1small=='a')&&(_c2small=='f')&&(_lentword==2)) {
    asmtoken(+_RG_AF); asmrdword_tokspc(); ok = +TRUE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchixiy()
{
VAR BOOL ok;
  IF (_lentword==2) {
    IF       ((_c1small=='i')&&(_c2small=='x')) {
      asmtoken(+_RG_IX); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='i')&&(_c2small=='y')) {
      asmtoken(+_RG_IY); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchhlixiy()
{
VAR BOOL ok;
  IF (_lentword==2) {
    IF       ((_c1small=='h')&&(_c2small=='l')) {
      asmtoken(+_RG_HL); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='i')&&(_c2small=='x')) {
      asmtoken(+_RG_IX); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='i')&&(_c2small=='y')) {
      asmtoken(+_RG_IY); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchir()
{
VAR BOOL ok;
  IF (_lentword==1) {
    IF       (_c1small=='i') {
      asmtoken(+_RG_I); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='r') {
      asmtoken(+_RG_R); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchrp()
{
VAR BOOL ok;
  IF (_lentword==2) {
    IF       ((_c1small=='b')&&(_c2small=='c')) {asmtoken(+_RG_BC); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='d')&&(_c2small=='e')) {asmtoken(+_RG_DE); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='h')&&(_c2small=='l')) {asmtoken(+_RG_HL); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='s')&&(_c2small=='p')) {asmtoken(+_RG_SP); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='i')&&(_c2small=='x')) {asmtoken(+_RG_IX); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='i')&&(_c2small=='y')) {asmtoken(+_RG_IY); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='r')&&(_c2small=='p')) { //rp ьхЄър
      asmrdword_tokspc();
      asmtoken(+_RG_RPBYNAME);
      toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
      asmrdword_tokspc();
      ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

FUNC BOOL matchrb()
{
VAR BOOL ok;
  IF (_lentword==1) {
    IF       (_c1small=='b') {asmtoken(+_RG_B); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='c') {asmtoken(+_RG_C); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='d') {asmtoken(+_RG_D); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='e') {asmtoken(+_RG_E); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='h') {asmtoken(+_RG_H); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='l') {asmtoken(+_RG_L); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF (_c1small=='a') {asmtoken(+_RG_A); asmrdword_tokspc(); ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE IF (_lentword==2) {
    IF       ((_c1small=='h')&&(_c2small=='x')) {asmtoken(+_RG_HX); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='l')&&(_c2small=='x')) {asmtoken(+_RG_LX); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='h')&&(_c2small=='y')) {asmtoken(+_RG_HY); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='l')&&(_c2small=='y')) {asmtoken(+_RG_LY); asmrdword_tokspc(); ok = +TRUE;
    }ELSE IF ((_c1small=='r')&&(_c2small=='b')) { //rb ьхЄър
      asmrdword_tokspc();
      asmtoken(+_RG_RBBYNAME);
      toktext(); //ухэхЁшЁєхЄ <text>text<endtext>
      asmrdword_tokspc();
      ok = +TRUE;
    }ELSE ok = +FALSE;
  }ELSE ok = +FALSE;
  RETURN ok;
}

////////////// ьр°шээючртшёшь√х уЁєяя√ ёЁртэхэшщ фы  ярЁёшэур ўрёЄ√ї ярЁрьхЄЁют

PROC asm_hlix_close_token(BYTE hltoken, BYTE ixtoken)
{
  IF (matchhl()) {
    IF (matchclose()) {asmtoken(hltoken);
    }ELSE tokerr(+_ERRCLOSE); //no closing bracket
  }ELSE IF (matchixiy()) {
    IF (tokexpr_close()) {asmtoken(ixtoken);
    }ELSE tokerr(+_ERREXPR); //wrong expr / no closing bracket
  }ELSE tokerr(+_ERRREG); //wrong register
}

PROC asm_directhlixrp_close_token(BYTE directtoken, BYTE hltoken, BYTE ixtoken, BYTE rptoken)
{
  IF (matchhl()){
    IF (matchclose()) {asmtoken(hltoken);
    }ELSE tokerr(+_ERRCLOSE); //no closing bracket
  }ELSE IF (matchixiy()) {
    IF (tokexpr_close()) {asmtoken(ixtoken);
    }ELSE tokerr(+_ERREXPR); //wrong expr / no closing bracket
  }ELSE IF (matchrp()) {
    IF (matchclose()) {asmtoken(rptoken);
    }ELSE tokerr(+_ERRCLOSE); //no closing bracket
  }ELSE //if(matchdirect()) {
    IF (tokexpr_close()) {asmtoken(directtoken);
    }ELSE tokerr(+_ERREXPR); //wrong expr / no closing bracket
  //}else tokerr(+_ERRPAR); //wrong register
}

PROC asm_directrb_token(BYTE directtoken, BYTE rbtoken)
{
  IF (matchrb()) { //<cmd> rb
    asmtoken(rbtoken);
  }ELSE //if(matchdirect()) { //<cmd> #N
    IF (tokexpr()) {asmtoken(directtoken);
    }ELSE tokerr(+_ERREXPR); //wrong expr
  //}else tokerr(+_ERRPAR); //wrong register or direct expr
}

///////////////////////////////////////////////////

PROC tokex()
{
//  _ignoreprime = +TRUE;
  asmtoken(+_ASMEX);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: a, <rp>/rp ьхЄър
  IF (matchopen()) { //ex (sp),hl/ix/iy
    IF (matchsp()) {
      IF (matchclose()) {
        IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: hl, ix, iy
          IF (matchhlixiy()) {asmtoken(+_FMTEXRPRP);
          }ELSE tokerr(+_ERRREG); //wrong register
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERRCLOSE); //no closing bracket
    }ELSE tokerr(+_ERRREG); //wrong register
  }ELSE IF (matchde()) { //ex de,hl
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: hl
      IF (matchhl()) {asmtoken(+_FMTEXRPRP);
      }ELSE tokerr(+_ERRREG); //wrong register
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE IF (matchaf()) { //ex af,af'
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: af'
      IF (matchaf()) {
        IF (matchprime()) {asmtoken(+_FMTEXRPRP);
        }ELSE tokerr(+_ERRREG); //wrong register
      }ELSE tokerr(+_ERRREG); //wrong register
    }ELSE tokerr(+_ERRCOMMA); //no comma
  };
//  _ignoreprime = +FALSE;
}

PROC tokinc()
{
  asmtoken(+_ASMINC);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: <rb>, <rp>, '(' фы  (hl), '(' фы  (ix/iy[+-d]), rp ьхЄър (ухэхЁшЁютрЄ№ rpbyname), rb ьхЄър (ухэхЁшЁютрЄ№ rbbyname)
  IF (matchopen()) { //inc (hl) шыш inc(ix/iy[+-d])
    asm_hlix_close_token(+_FMTINCDECMHL/**_FMTALUCMDMHL*/, +_FMTINCDECIDX/**_FMTALUCMDIDX*/);
  }ELSE { //эх ёъюсъш
    IF (matchrp()) {asmtoken(+_FMTINCRP); //bc,de,hl,sp,ix,iy,rp ьхЄър
    }ELSE IF (matchrb()) {asmtoken(+_FMTINCDECRB/**_FMTALUCMDRB*/); //b,c,d,e,h,l,a,hx,lx,hy,ly,rb ьхЄър
    }ELSE tokerr(+_ERRREG); //wrong register
  };
}

PROC tokdec()
{
  asmtoken(+_ASMDEC);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: <rb>, <rp>, '(' фы  (hl), '(' фы  (ix/iy[+-d]), rp ьхЄър (ухэхЁшЁютрЄ№ rpbyname), rb ьхЄър (ухэхЁшЁютрЄ№ rbbyname)
  IF (matchopen()) { //inc (hl) шыш inc(ix/iy[+-d])
    asm_hlix_close_token(+_FMTINCDECMHL/**_FMTALUCMDMHL*/, +_FMTINCDECIDX/**_FMTALUCMDIDX*/);
  }ELSE { //эх ёъюсъш
    IF (matchrp()) {asmtoken(+_FMTDECRP); //bc,de,hl,sp,ix,iy,rp ьхЄър
    }ELSE IF (matchrb()) {asmtoken(+_FMTINCDECRB/**_FMTALUCMDRB*/); //b,c,d,e,h,l,a,hx,lx,hy,ly,rb ьхЄър
    }ELSE tokerr(+_ERRREG); //wrong register
  };
}

PROC tokadd()
{
  asmtoken(+_ASMADD);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: a, <rp>/rp ьхЄър
  IF (matcha()) {
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: N, '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
      IF (matchopen()) {asm_hlix_close_token(+_FMTALUCMDMHL, +_FMTALUCMDIDX); //add a,(hl) шыш add a,(ix/iy[+-d])
      }ELSE asm_directrb_token(+_FMTALUCMDN, +_FMTALUCMDRB); //add a,#N шыш add a,rb
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE IF (matchhlixiy()) { //add hl/ix/iy,rp
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: <rp>/rp ьхЄър
      IF (matchrp()) {asmtoken(+_FMTADDHLRP);
      }ELSE tokerr(+_ERRREG); //wrong register
    }ELSE tokerr(+_ERRCOMMA); //no comma
  };
}

PROC tokadc()
{
  asmtoken(+_ASMADC);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: a, hl
  IF (matcha()) {
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: N, '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
      IF (matchopen()) {asm_hlix_close_token(+_FMTALUCMDMHL, +_FMTALUCMDIDX); //adc a,(hl) шыш adc a,(ix/iy[+-d])
      }ELSE asm_directrb_token(+_FMTALUCMDN, +_FMTALUCMDRB); //adc a,#N шыш adc a,rb
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE IF (matchhl()) { //adc hl,rp
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: <rp>/rp ьхЄър
      IF (matchrp()) {asmtoken(+_FMTADCHLRP);
      }ELSE tokerr(+_ERRREG); //wrong register
    }ELSE tokerr(+_ERRCOMMA); //no comma
  };
}

PROC toksbc()
{
  asmtoken(+_ASMSBC);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: a, hl
  IF (matcha()) {
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: N, '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
      IF (matchopen()) {asm_hlix_close_token(+_FMTALUCMDMHL, +_FMTALUCMDIDX); //adc a,(hl) шыш adc a,(ix/iy[+-d])
      }ELSE asm_directrb_token(+_FMTALUCMDN, +_FMTALUCMDRB); //adc a,#N шыш adc a,rb
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE IF (matchhl()) { //sbc hl,rp
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: <rp>/rp ьхЄър
      IF (matchrp()) {asmtoken(+_FMTSBCHLRP);
      }ELSE tokerr(+_ERRREG); //wrong register
    }ELSE tokerr(+_ERRCOMMA); //no comma
  };
}

PROC tokalucmd(BYTE token)
{
  asmtoken(token);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє //фры№°х ьюцхЄ с√Є№: N, '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
  IF (matchopen()) {asm_hlix_close_token(+_FMTALUCMDMHL, +_FMTALUCMDIDX); //<cmd> (hl) шыш <cmd> (ix/iy[+-d])
  }ELSE asm_directrb_token(+_FMTALUCMDN, +_FMTALUCMDRB); //<cmd> #N шыш <cmd> rb
}

PROC tokcbxx(BYTE token)
{
  asmtoken(token);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє //фры№°х ьюцхЄ с√Є№: '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
  IF (matchopen()) {asm_hlix_close_token(+_FMTCBCMDMHL, +_FMTCBCMDIDX); //<cmd> (hl) шыш <cmd> (ix/iy[+-d])
  }ELSE { //<cmd> rb
    IF (matchrb()) {asmtoken(+_FMTCBCMDRB);
    }ELSE tokerr(+_ERRREG); //wrong register
  };
}

PROC tokbit(BYTE token)
{
  asmtoken(token);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
  IF (tokexpr()) {
    asmtoken(+_OPBIT); //фы  bit/res/set: яЁютхЁ хЄ pseudon (ЁрчЁх°хэю Єюы№ъю 0..7, шэрўх ю°шсър), єьэюцрхЄ эр 8 ш яЁшсрты хЄ ъ срчх юяъюфр
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
      IF (matchopen()) {asm_hlix_close_token(+_FMTCBCMDMHL, +_FMTCBCMDIDX); //<cmd> N,(hl) шыш <cmd> N,(ix/iy[+-d])
      }ELSE { //<cmd> N,rb
        IF (matchrb()) {asmtoken(+_FMTCBCMDRB);
        }ELSE tokerr(+_ERRREG); //wrong register
      };
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE tokerr(+_ERREXPR); //wrong expr
}

PROC tokout()
{
  asmtoken(+_ASMOUT);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє //фры№°х ьюцхЄ с√Є№: '(' фы  c, '(' фы  #N
  IF (matchopen()) {
    IF (matchc()) {
      IF (matchclose()) {
        IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: <rb>/rb ьхЄър
          IF (matchrb()) {asmtoken(+_FMTOUTCRB);
          }ELSE tokerr(+_ERRREG); //wrong register
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERRCLOSE); //no closing bracket
    }ELSE IF (tokexpr_close()) { //out (#N),a
      IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: a
        IF (matcha()) {asmtoken(+_FMTALUCMDN);
        }ELSE tokerr(+_ERRREG); //wrong register
      }ELSE tokerr(+_ERRCOMMA); //no comma
    }ELSE tokerr(+_ERRPAR); //wrong parameter / no closing bracket
  }ELSE tokerr(+_ERROPEN); //no opening bracket
}

PROC tokin()
{
  asmtoken(+_ASMIN);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє //фры№°х ьюцхЄ с√Є№: a, <rb>/rb ьхЄър
  IF (matcha()) {
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: '(' фы  c, '(' фы  #N
      IF (matchopen()) {
        IF (matchc()) {
          IF (matchclose()) {asmtoken(+_FMTINRBC);
          }ELSE tokerr(+_ERRCLOSE); //no closing bracket
        }ELSE IF (tokexpr_close()) {
          asmtoken(+_FMTALUCMDN); //in a,(#N)
        }ELSE tokerr(+_ERRPAR); //wrong parameter / no closing bracket
      }ELSE tokerr(+_ERROPEN); //no opening bracket
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE IF (matchrb()) {
    IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: '(' фы  c
      IF (matchopen()) {
        IF (matchc()) {
          IF (matchclose()) {asmtoken(+_FMTINRBC);
          }ELSE tokerr(+_ERRCLOSE); //no closing bracket
        }ELSE tokerr(+_ERRPAR); //wrong parameter
      }ELSE tokerr(+_ERROPEN); //no opening bracket
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE tokerr(+_ERRREG); //wrong register
}

PROC tokpush()
{
  asmtoken(+_ASMPUSH);
  asmrdword_tokspc();
  IF (matchaf()) {asmtoken(+_FMTPUSHPOPRP);
  }ELSE IF (matchrp()) {asmtoken(+_FMTPUSHPOPRP);
  }ELSE tokerr(+_ERRREG); //wrong register
}

PROC tokpop()
{
  asmtoken(+_ASMPOP);
  asmrdword_tokspc();
  IF (matchaf()) {asmtoken(+_FMTPUSHPOPRP);
  }ELSE IF (matchrp()) {asmtoken(+_FMTPUSHPOPRP);
  }ELSE tokerr(+_ERRREG); //wrong register
}

PROC tokld() //(ix) схч +d эх яюффхЁцштрхЄё , Є.ъ. фы  ¤Єюую эєцэ√ фюяюыэшЄхы№э√х ЇюЁьрЄ√ шыш тЁєўэє■ тёЄрты Є№ push0 - TODO
{
  asmtoken(+_ASMLD);
  asmrdword_tokspc(); //ъюьрэфр ьюцхЄ с√Є№: 'I', 'R', <rb>, <rp>, '(' фы  NN, '(' фы  (hl), '(' фы  (ix/iy[+-d]), rp ьхЄър (ухэхЁшЁютрЄ№ rpbyname), rb ьхЄър (ухэхЁшЁютрЄ№ rbbyname)
  IF (matchopen()) { //ёъюсъш т яхЁтюь ярЁрьхЄЁх
    IF (matchhl()) { //ld (hl),rb шыш ld (hl),N
      IF (matchclose()) {
        IF (matchcomma()) {asm_directrb_token(+_FMTPUTMHLN, +_FMTPUTMHLRB);
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERRCLOSE); //no closing bracket
    }ELSE IF (matchixiy()) { //ld (ix/iy[+-d]),rb шыш ld (ix/iy[+-d]),N
      IF (tokexpr_close()) { //яюёых эхую яЁш ю°шсъх эшўхую сюы№°х эхы№ч  яЁютхЁ Є№, Є.ъ. ъєЁёюЁ ьюу ёфтшэєЄ№ё 
        IF (matchcomma()) {asm_directrb_token(+_FMTPUTIDXN, +_FMTPUTIDXRB);
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERREXPR); //wrong expr / no closing bracket
    }ELSE IF (matchrp()) { //ld (rp),a
      IF (matchclose()) {
        IF (matchcomma()) {
          IF (matcha()) {asmtoken(+_FMTPUTMRPA);
          }ELSE tokerr(+_ERRREG); //wrong register
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERRCLOSE); //no closing bracket
    }ELSE //if(matchdirect()) { //ld (#NN),a шыш ld (#NN),rp
      IF (tokexpr_close()) { //яюёых эхую яЁш ю°шсъх эшўхую сюы№°х эхы№ч  яЁютхЁ Є№, Є.ъ. ъєЁёюЁ ьюу ёфтшэєЄ№ё 
        IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: 'a', <rp>/rp ьхЄър
          IF (matcha()) {asmtoken(+_FMTPUTMNNA);
          }ELSE IF (matchrp()) {asmtoken(+_FMTPUTMNNRP);
          }ELSE tokerr(+_ERRREG); //wrong register
        }ELSE tokerr(+_ERRCOMMA); //no comma
      }ELSE tokerr(+_ERREXPR); //wrong expr
    //}else tokerr(+_ERRPAR); //wrong register (todo яюяЁюсютрЄ№ ЄєЄ Єюцх expr)

  }ELSE { //эх ёъюсъш //ъюьрэфр ьюцхЄ с√Є№: 'I', 'R', <rb>, <rp>, rp ьхЄър (ухэхЁшЁютрЄ№ rpbyname), rb ьхЄър (ухэхЁшЁютрЄ№ rbyname)
    IF (matchrp()) {
      IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: NN, '(' фы  NN
        IF (matchopen()) {asm_direct_expr_close_token(+_FMTGETRPMNN); //ld rp,(#NN)
        }ELSE IF (matchrp()) {asmtoken(+_FMTMOVRPRP); //ld rp,rp
        }ELSE //if(matchdirect()) { //ld rp,#NN
          IF (tokexpr()) {asmtoken(+_FMTLDRPNN);
          }ELSE tokerr(+_ERREXPR); //wrong expr
        //}else tokerr(+_ERRPAR); //wrong parameter
      }ELSE tokerr(+_ERRCOMMA); //no comma
    }ELSE IF (matcha()) {
      IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: 'I', 'R', N, '(' фы  NN, '(' фы  rp, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
        IF (matchopen()) {asm_directhlixrp_close_token(+_FMTGETAMNN, +_FMTGETRBMHL, +_FMTGETRBIDX, +_FMTGETAMRP); //ld a,(#NN) шыш ld a,(hl) шыш ld a,(ix/iy[+-d]) шыш ld a,(rp)
        }ELSE IF (matchir()) {asmtoken(+_FMTMOVAIR); //ld a,i/r
        }ELSE asm_directrb_token(+_FMTLDRBN, +_FMTMOVRBRB); //ld a,#N шыш ld a,rb
      }ELSE tokerr(+_ERRCOMMA); //no comma
    }ELSE IF (matchrb()) {
      IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: N, '(' фы  hl, '(' фы  (ix/iy[+-d]), <rb>/rb ьхЄър
        IF (matchopen()) {asm_hlix_close_token(+_FMTGETRBMHL, +_FMTGETRBIDX); //ld rb,(hl) шыш ld rb,(ix/iy[+-d])
        }ELSE asm_directrb_token(+_FMTLDRBN, +_FMTMOVRBRB); //ld rb,#N шыш ld rb,rb
      }ELSE tokerr(+_ERRCOMMA); //no comma
    }ELSE IF (matchir()) { //ld i/r,a
      IF (matchcomma()) { //фры№°х ьюцхЄ с√Є№: 'a'
        IF (matcha()) {asmtoken(+_FMTMOVIRA);
        }ELSE tokerr(+_ERRREG); //wrong register
      }ELSE tokerr(+_ERRCOMMA); //no comma
    }ELSE tokerr(+_ERRREG); //wrong register
  };
}

PROC tokret()
{
  asmtoken(+_ASMRET);
  asmrdword_tokspc(); //ё·хфрхь ret
  IF ((_asmwaseols!=0)||(_asmwaseof)||(*(PCHAR)_tword==':')||(*(PCHAR)_tword==';')) { //ret
    asmtoken(+_FMTXX);
  }ELSE { //ret cc
    IF (matchcc()) {asmtoken(+_FMTXX);
    }ELSE tokerrcmd();
  };
}

PROC tokdjnz()
{
  asmtoken(+_ASMDJNZ);
  asmrdword_tokspc(); //ё·хфрхь djnz
  IF (tokexpr()) {asmtoken(+_FMTJRDD);
  }ELSE tokerr(+_ERREXPR); //wrong expr
}

PROC tokjr()
{
  asmtoken(+_ASMJR);
  asmrdword_tokspc(); //ё·хфрхь jr
  IF (matchnzzncc()) { //jr cc,NN
    IF (matchcomma()) {
      IF (tokexpr()) {asmtoken(+_FMTJRDD);
      }ELSE tokerr(+_ERREXPR); //wrong expr
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE { //jr NN
    IF (tokexpr()) {asmtoken(+_FMTJRDD);
    }ELSE tokerr(+_ERREXPR); //wrong expr
  };
}

PROC tokjp()
{
  asmtoken(+_ASMJP);
  asmrdword_tokspc(); //ё·хфрхь jp
  IF (matchcc()) { //jp cc,NN
    IF (matchcomma()) {
      IF (tokexpr()) {asmtoken(+_FMTJPNN);
      }ELSE tokerr(+_ERREXPR); //wrong expr
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE { //jp NN
    IF (matchopen()) { //ёъюсър
      IF (matchhlixiy()) { //jp (hl)/(ix)/(iy)
        IF (matchclose()) {asmtoken(+_FMTJPRP);
        }ELSE tokerr(+_ERRCLOSE); //no closing bracket
      }ELSE IF (tokexpr_close()) {asmtoken(+_FMTJPNN);
      }ELSE tokerr(+_ERREXPR); //wrong expr
    }ELSE IF (tokexpr()) {asmtoken(+_FMTJPNN);
    }ELSE tokerr(+_ERREXPR); //wrong expr
  };
}

PROC tokcall()
{
  asmtoken(+_ASMCALL);
  asmrdword_tokspc(); //ё·хфрхь call
  IF (matchcc()) { //call cc,NN
    IF (matchcomma()) {
      IF (tokexpr()) {asmtoken(+_FMTJPNN);
      }ELSE tokerr(+_ERREXPR); //wrong expr
    }ELSE tokerr(+_ERRCOMMA); //no comma
  }ELSE { //call NN
    IF (tokexpr()) {asmtoken(+_FMTJPNN);
    }ELSE tokerr(+_ERREXPR); //wrong expr
  };
}

PROC tokrst()
{
  asmtoken(+_ASMRST);
  asmrdword_tokspc(); //ё·хфрхь rst
  IF (tokexpr()) {asmtoken(+_FMTRST);
  }ELSE tokerr(+_ERREXPR); //wrong expr
}

PROC tokim()
{
  asmtoken(+_ASMIM);
  asmrdword_tokspc(); //ё·хфрхь im
  IF (tokexpr()) {asmtoken(+_FMTIM);
  }ELSE tokerr(+_ERREXPR); //wrong expr
}

PROC tokxx(BYTE token) //ъюьрэфр схч ярЁрьхЄЁют
{
  asmtoken(token);
  asmrdword_tokspc(); //ё·хфрхь ъюьрэфє
  asmtoken(+_FMTXX);
}

PROC tokalucmdN()
{
  tokalucmd(_temppar);
}

PROC tokxxN()
{
  tokxx(_temppar);
}

PROC tokcbxxN()
{
  tokcbxx(_temppar);
}

PROC tokbitN()
{
  tokbit(_temppar);
}

PROC tokpre()
{
  tokaddlbl("LD"  , (PBYTE)&tokld  , 0x00);
  tokaddlbl("CALL", (PBYTE)&tokcall, 0x00);
  tokaddlbl("JP"  , (PBYTE)&tokjp  , 0x00);
  tokaddlbl("RET" , (PBYTE)&tokret , 0x00);
  tokaddlbl("JR"  , (PBYTE)&tokjr  , 0x00);

  tokaddlbl("DB"  , (PBYTE)&tokdb  , 0x00); //db ..., тьхёЄю defb - эрфю яюёых ърцфюую т√Ёрцхэш  ЇюЁьрЄ writeN, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш 
  tokaddlbl("DW"  , (PBYTE)&tokdw  , 0x00); //dw ..., тьхёЄю defw - эрфю яюёых ърцфюую т√Ёрцхэш  ЇюЁьрЄ writeNN
  tokaddlbl("DL"  , (PBYTE)&tokdl  , 0x00); //dl ..., тьхёЄю defl - эрфю яюёых ърцфюую т√Ёрцхэш  ЇюЁьрЄ writeNNNN
  tokaddlbl("DS"  , (PBYTE)&tokds  , 0x00); //ds ..., тьхёЄю defs - эрфю ЇюЁьрЄ writeds

  tokaddlbl("POP" , (PBYTE)&tokpop , 0x00);
  tokaddlbl("PUSH", (PBYTE)&tokpush, 0x00);

  tokaddlbl("ADD" , (PBYTE)&tokadd , 0x00);
  tokaddlbl("ADC" , (PBYTE)&tokadc , 0x00);
  tokaddlbl("SUB" , (PBYTE)&tokalucmdN, +_ASMSUB);
  tokaddlbl("SBC" , (PBYTE)&toksbc , 0x00);
  tokaddlbl("AND" , (PBYTE)&tokalucmdN, +_ASMAND);
  tokaddlbl("OR"  , (PBYTE)&tokalucmdN, +_ASMOR);
  tokaddlbl("XOR" , (PBYTE)&tokalucmdN, +_ASMXOR);
  tokaddlbl("CP"  , (PBYTE)&tokalucmdN, +_ASMCP);
  tokaddlbl("INC" , (PBYTE)&tokinc , 0x00);
  tokaddlbl("DEC" , (PBYTE)&tokdec , 0x00);

  tokaddlbl("EX"  , (PBYTE)&tokex  , 0x00);

  tokaddlbl("RLC" , (PBYTE)&tokcbxxN, +_ASMRLC);
  tokaddlbl("RRC" , (PBYTE)&tokcbxxN, +_ASMRRC);
  tokaddlbl("RL"  , (PBYTE)&tokcbxxN, +_ASMRL);
  tokaddlbl("RR"  , (PBYTE)&tokcbxxN, +_ASMRR);
  tokaddlbl("SLA" , (PBYTE)&tokcbxxN, +_ASMSLA);
  tokaddlbl("SRA" , (PBYTE)&tokcbxxN, +_ASMSRA);
  tokaddlbl("SLI" , (PBYTE)&tokcbxxN, +_ASMSLI);
  tokaddlbl("SRL" , (PBYTE)&tokcbxxN, +_ASMSRL);

  tokaddlbl("DJNZ", (PBYTE)&tokdjnz, 0x00);

  tokaddlbl("RST" , (PBYTE)&tokrst , 0x00);

  tokaddlbl("OUT" , (PBYTE)&tokout , 0x00);
  tokaddlbl("IN"  , (PBYTE)&tokin  , 0x00);

  tokaddlbl("BIT" , (PBYTE)&tokbitN, +_ASMBIT);
  tokaddlbl("RES" , (PBYTE)&tokbitN, +_ASMRES);
  tokaddlbl("SET" , (PBYTE)&tokbitN, +_ASMSET);

  tokaddlbl("IM"  , (PBYTE)&tokim  , 0x00);

  tokaddlbl("RLCA", (PBYTE)&tokxxN, +_ASMRLCA);
  tokaddlbl("RRCA", (PBYTE)&tokxxN, +_ASMRRCA);
  tokaddlbl("RLA" , (PBYTE)&tokxxN, +_ASMRLA);
  tokaddlbl("RRA" , (PBYTE)&tokxxN, +_ASMRRA);
  tokaddlbl("DAA" , (PBYTE)&tokxxN, +_ASMDAA);
  tokaddlbl("CPL" , (PBYTE)&tokxxN, +_ASMCPL);
  tokaddlbl("SCF" , (PBYTE)&tokxxN, +_ASMSCF);
  tokaddlbl("CCF" , (PBYTE)&tokxxN, +_ASMCCF);
  tokaddlbl("NOP" , (PBYTE)&tokxxN, +_ASMNOP);
  tokaddlbl("HALT", (PBYTE)&tokxxN, +_ASMHALT);
  tokaddlbl("DI"  , (PBYTE)&tokxxN, +_ASMDI);
  tokaddlbl("EI"  , (PBYTE)&tokxxN, +_ASMEI);
  tokaddlbl("EXX" , (PBYTE)&tokxxN, +_ASMEXX);

  tokaddlbl("RETN", (PBYTE)&tokxxN, +_ASMRETN);
  tokaddlbl("RETI", (PBYTE)&tokxxN, +_ASMRETI);

  tokaddlbl("LDI" , (PBYTE)&tokxxN, +_ASMLDI);
  tokaddlbl("LDD" , (PBYTE)&tokxxN, +_ASMLDD);
  tokaddlbl("LDIR", (PBYTE)&tokxxN, +_ASMLDIR);
  tokaddlbl("LDDR", (PBYTE)&tokxxN, +_ASMLDDR);
  tokaddlbl("CPI" , (PBYTE)&tokxxN, +_ASMCPI);
  tokaddlbl("CPD" , (PBYTE)&tokxxN, +_ASMCPD);
  tokaddlbl("CPIR", (PBYTE)&tokxxN, +_ASMCPIR);
 
  tokaddlbl("CPDR", (PBYTE)&tokxxN, +_ASMCPDR);
  tokaddlbl("INI" , (PBYTE)&tokxxN, +_ASMINI);
  tokaddlbl("IND" , (PBYTE)&tokxxN, +_ASMIND);
  tokaddlbl("INIR", (PBYTE)&tokxxN, +_ASMINIR);
  tokaddlbl("INDR", (PBYTE)&tokxxN, +_ASMINDR);
  tokaddlbl("OUTI", (PBYTE)&tokxxN, +_ASMOUTI);
  tokaddlbl("OUTD", (PBYTE)&tokxxN, +_ASMOUTD);
  tokaddlbl("OTIR", (PBYTE)&tokxxN, +_ASMOTIR);
  tokaddlbl("OTDR", (PBYTE)&tokxxN, +_ASMOTDR);
  tokaddlbl("INF" , (PBYTE)&tokxxN, +_ASMINF);

  tokaddlbl("NEG" , (PBYTE)&tokxxN, +_ASMNEG);

  tokaddlbl("ORG" , (PBYTE)&tokorg , 0x00); /**org nn - эрфю ЇюЁьрЄ writeorg, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш */

//  tokaddlbl("ALIGN",(PBYTE)&tokalign,0x00); /**align nn - эрфю ЇюЁьрЄ writealign, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш */
//  tokaddlbl("PAGE", (PBYTE)&tokpage, 0x00); /**page n - эрфю ЇюЁьрЄ writepage, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш */
//  tokaddlbl("IF"  , (PBYTE)&tokif  , 0x00); /**if nn - эрфю ЇюЁьрЄ writeif, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш */
//  tokaddlbl("ELSE", (PBYTE)&tokelse, 0x00); /**else*/
//  tokaddlbl("ENDIF",(PBYTE)&tokendif,0x00); /**endif*/
//  tokaddlbl("DUP" , (PBYTE)&tokdup , 0x00); /**dup nn - эрфю ЇюЁьрЄ writedup, ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэш */
//  tokaddlbl("EDUP", (PBYTE)&tokedup, 0x00); /**edup*/
//  tokaddlbl("MACRO",(PBYTE)&tokmacro,0x00); /**macro name - ЁрчсшЁрЄ№ тЁєўэє■?*/
//  tokaddlbl("ENDM", (PBYTE)&tokendm, 0x00); /**endm*/
  //tokaddlbl("USEMACRO",(PBYTE)&tokusemacro, 0x00); /**usemacro name ... - ЁрчсшЁрЄ№ тЁєўэє■?*/
  tokaddlbl("EXPORT",(PBYTE)&tokexport, 0x00); /**export name - ЁрчсшЁрЄ№ тЁєўэє■?*/
//  tokaddlbl("LOCAL",(PBYTE)&toklocal,0x00); /**local name - ЁрчсшЁрЄ№ тЁєўэє■?*/
//  tokaddlbl("ENDL", (PBYTE)&tokendl, 0x00); /**endl*/
//  tokaddlbl("DISP", (PBYTE)&tokdisp, 0x00); /**disp nn - эрфю ЇюЁьрЄ writedisp*/
//  tokaddlbl("ENT" , (PBYTE)&tokent , 0x00); /**ent*/
  tokaddlbl("INCLUDE",(PBYTE)&tokinclude, 0x00); /**include "filename" - ЁрчсшЁрЄ№ тЁєўэє■?*/
  tokaddlbl("INCBIN",(PBYTE)&tokincbin, 0x00); /**incbin "filename" - ЁрчсшЁрЄ№ тЁєўэє■?*/
//  tokaddlbl("DISPLAY",(PBYTE)&tokdisplay, 0x00); /**display nn - ЇюЁьрЄ√ displaynum, displaystring - ЁрчсшЁрЄ№ тЁєўэє■ эх яюыєўшЄё  шч-чр т√Ёрцхэшщ*/
//  tokaddlbl("REPEAT",(PBYTE)&tokrepeat, 0x00); /**repeat*/
//  tokaddlbl("UNTIL",(PBYTE)&tokuntil, 0x00); /**until nn - эрфю ЇюЁьрЄ writeuntil*/
//  tokaddlbl("STRUCT",(PBYTE)&tokstruct, 0x00); /**struct name - ЁрчсшЁрЄ№ тЁєўэє■?*/
//  tokaddlbl("ENDSTRUCT",(PBYTE)&tokendstruct, 0x00); /**endstruct*/

  tokaddlbl(":",(PBYTE)&tokcolon, 0x00);
//  tokaddlbl(";",(PBYTE)&tokcomment, 0x00); //яЁютхЁ хЄё  юЄфхы№эю
}