Subversion Repositories NedoOS

Rev

Rev 653 | Blame | Compare with Previous | Last modification | View Log | Download

  1. //// ёЄрэфрЁЄэ√х тхЄъш
  2.  
  3.       case _CMDINCLUDE: {
  4.         _inclfile[_ninclfiles] = _fin;
  5.         INC _ninclfiles;
  6.         _lenfn = 0;
  7.         i = 0;
  8.         readfin(); //tab
  9.         readfin(); //"
  10.         //readfin(); //TOK_WRSTR
  11.         _token = readfin(); //TOK_TEXT
  12.         inclfnloop:
  13.           asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  14.           IF ((_token==+_TOKENDTEXT)||_waseof) goto inclfnq; //BREAK;
  15.           //IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
  16.           _lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
  17.           IF ((CHAR)_token == '.') i = _lenfn;
  18.           goto inclfnloop;
  19.         inclfnq:
  20.    //_lenfn = strjoineol(_fn, 0, _fn, '.'); //terminator is not copied
  21.    //_lenfn = stradd(_fn, _lenfn, '.');
  22.    _lenfn = i; //after last dot
  23.    _lenfn = stradd(_fn, _lenfn, (CHAR)((BYTE)_fn[_lenfn]&0xdf));
  24.    _lenfn = stradd(_fn, _lenfn, '_');
  25.         _fn[_lenfn] = '\0';
  26.         readfin(); //"
  27.         _fin = nfopen(_fn, "rb");
  28.    IF (_fin != (PBYTE)0) {
  29.        goto loop;
  30. ///ё■фр яюярф╕ь т ъюэЎх Їрщыр
  31.       inclq:
  32.         fclose(_fin);
  33.    }ELSE {
  34.      errstr("no "); errstr(_fn); enderr();
  35.    };
  36.         DEC _ninclfiles;
  37.         _fin = _inclfile[_ninclfiles];
  38.         _waseof = +FALSE;
  39.         goto loop;
  40.       }
  41.  
  42.       case _CMDINCBIN: {
  43.         _lenfn = 0;
  44.         readfin(); //tab
  45.         readfin(); //"
  46.         //readfin(); //TOK_WRSTR
  47.         _token = readfin(); //TOK_TEXT
  48.         incbfnloop:
  49.           asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  50.           IF ((_token==+_TOKENDTEXT)||_waseof) goto incbfnq; //BREAK;
  51.           //IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
  52.           _lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
  53.           goto incbfnloop;
  54.         incbfnq:
  55.         _fn[_lenfn] = '\0';
  56.         readfin(); //"
  57.         _fincb = nfopen(_fn, "rb");
  58.    IF (_fincb != (PBYTE)0) {
  59.         incbloop:
  60.           _token = readf(_fincb);
  61.           IF (_waseof) goto incbq; //BREAK;
  62.           asmbyte(_token);
  63.           goto incbloop;
  64.         incbq:
  65.         fclose(_fincb);
  66.    }ELSE {
  67.      errstr("no "); errstr(_fn); enderr();
  68.    };
  69.         _waseof = +FALSE;
  70.         goto loop;
  71.       }
  72.  
  73.       //case _CMDREADSTATE: {asmreadstate(); goto loop;}
  74.       case _CMDLABEL: {
  75.         _isaddr = 0x00;
  76.         _curdir = _token;
  77.         asmdir_label(); //эхы№ч  ёхщўрё яхЁхюяЁхфхы Є№! шэрўх эхы№ч  label=label+1
  78.         goto loop;
  79.       }
  80.  
  81.       case _CMDEXPORT: /**{
  82.         _lenfn = 0;
  83.         readfin(); //tab
  84.         readfin(); //TOK_LABEL
  85.         _token = readfin(); //TOK_TEXT
  86.         getexploop:
  87.           asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  88.           IF ((_token==+_TOKENDTEXT)||_waseof) goto getexpq; //BREAK;
  89.           //IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
  90.           _lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
  91.           goto getexploop;
  92.         getexpq:
  93.         _fn[_lenfn] = '\0';
  94.         goto loop;
  95.       }*/
  96.  
  97.       case _CMDORG:
  98.       case _CMDDISP:
  99.       case _CMDDB:
  100.       case _CMDDW:
  101.       case _CMDDL:
  102.       case _CMDDS:
  103.       case _CMDALIGN:
  104.  
  105.         {_isaddr = 0x00; _curdir=_token; goto loop;}
  106.  
  107.       case _FMTREEQU: {
  108.         asmfmt_reequ();
  109.         goto loop;
  110.       }
  111.       case _FMTCMD: {
  112.         IF (_curdir == +_CMDLABEL) {
  113.           IF (_labelchanged) {
  114.             errstr("redef "); errstr((PCHAR)_curlabeltext); enderr();
  115.           };
  116.         }ELSE IF (_curdir == +_CMDORG) {
  117.           asmemitblock();
  118.           _curaddr = (UINT)asmpopvalue();
  119.           _curbegin = _curaddr;
  120. #ifdef TARGET_THUMB
  121.         }ELSE IF (_curdir == +_CMDALIGN) {
  122.           //i = -(_curaddr+_curshift) & ((UINT)asmpopvalue()-1); //no bias "+1"
  123.           i = -(_curaddr+_curshift-_BIAS) & ((UINT)asmpopvalue()-1); //bias (thumb)
  124.           i = i;
  125.           WHILE (i!=0) {
  126.             asmbyte(0x00);
  127.             DEC i;
  128.           };
  129. #endif
  130.         }ELSE IF (_curdir == +_CMDDISP) {
  131.           _curshift = (UINT)asmpopvalue() - _curaddr; //todo тыюцхээю
  132.         }ELSE IF (_curdir == +_CMDENT) {
  133.           _curshift = 0; //todo тыюцхээю
  134.         }ELSE IF (_curdir == +_CMDDB) {
  135.         }ELSE IF (_curdir == +_CMDDW) {
  136.         }ELSE IF (_curdir == +_CMDDL) {
  137.         }ELSE IF (_curdir == +_CMDDS) {
  138.           IF (_nvalues==0x02) {_token = (BYTE)asmpopvalue();
  139.           }ELSE _token=0x00;
  140.           i = (UINT)asmpopvalue();
  141.           WHILE (i != 0) {
  142.             asmbyte(_token);
  143.             DEC i;
  144.           };
  145.           //fwrite(+(PBYTE)&zeros, 1, i, _fout);
  146.           //_curaddr = _curaddr + i;
  147.           //todo while фы  ds уЁєяя√ срщЄ, эю ЄЁєфэю сєфхЄ фюёЄрЄ№ шч ёЄхър
  148.         }ELSE IF (_curdir == +_CMDEXPORT) {
  149.           i = (UINT)asmpopvalue();
  150.           IF (_asms) { //ёухэхЁшЁютрЄ№ <_curlabeltext>=<?modname?>+<i-?base?>
  151.             decltoken(+_CMDLABEL);
  152.             decltoken(+_TOKTEXT);
  153.             fputs((PCHAR)_curlabeltext, _fdecl);
  154.             decltoken(+_TOKENDTEXT);
  155.             decltoken(+_TOKEQUAL/**'='*/);
  156.             decltoken(+_TOKEXPR);
  157.             decltoken(+_TOKLABEL);
  158.             decltoken(+_TOKTEXT);
  159.             decltoken((BYTE)'_'); //todo <modname>?
  160.             decltoken(+_TOKENDTEXT);
  161.             decltoken(+_TOKPLUS/**'+'*/);
  162.             decltoken(+_TOKNUM);
  163.             decltoken(+_TOKTEXT);
  164.             emitn(i-_curbegin/**_BASEADDR*/);
  165.             fputs((PCHAR)_nbuf, _fdecl); //+_TOKENDTEXT==0
  166.             decltoken(+_TOKENDTEXT);
  167.             //decltoken(+_OPADD);
  168.             decltoken(+_TOKENDEXPR);
  169.             decltoken(+_FMTREEQU);
  170.             decltoken(+_TOKEOL);
  171.           }; //
  172.         ;;}ELSE {err((CHAR)_token); enderr();
  173.         };
  174.         goto loop;
  175.       }
  176.  
  177.       case _TOKEXPR: {doexpr(); goto loop;}
  178.       case _TOKENDEXPR: {goto loop;}
  179. /**
  180.       case _OPPUSH0: {asmpushvalue(0L); goto loop;}
  181.  
  182.       case _OPADD:   {                           asmpushvalue(asmpopvalue()+asmpopvalue()); goto loop;}
  183.       case _OPSUB:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()-tempvalue); goto loop;}
  184.       case _OPMUL:   {                           asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00; goto loop;}
  185.       case _OPDIV:   {
  186.         tempvalue=asmpopvalue();
  187.         {
  188.         ;;IF (tempvalue!=0L)
  189.           asmpushvalue(asmpopvalue()/tempvalue);
  190.         }
  191.         goto loop;
  192.       }
  193.       case _OPAND:   {                           asmpushvalue(asmpopvalue()&asmpopvalue()); goto loop;}
  194.       case _OPOR:    {                           asmpushvalue(asmpopvalue()|asmpopvalue()); goto loop;}
  195.       case _OPXOR:   {                           asmpushvalue(asmpopvalue()^asmpopvalue()); goto loop;}
  196.       case _OPSHL:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()<<tempvalue); goto loop;}
  197.       case _OPSHR:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()>>tempvalue); goto loop;}
  198.       //case _OPEQ:    {                           asmpushbool((asmpopvalue()==asmpopvalue())); goto loop;} //шэрўх эхы№ч  т ыюу.т√Ёрцхэш ї шёяюы№чютрЄ№ ъюэёЄрэЄє TRUE (-1 шыш 1 эхяЁхфёърчєхью)
  199.       //case _OPNOTEQ: {                           asmpushbool((asmpopvalue()!=asmpopvalue())); goto loop;}
  200.       //case _OPLESS:  {tempvalue=asmpopvalue();   asmpushbool((UINT)asmpopvalue() <  (UINT)tempvalue); goto loop;}
  201.       //case _OPLESSEQ:{tempvalue=asmpopvalue();   asmpushbool((UINT)asmpopvalue() <= (UINT)tempvalue); goto loop;}
  202.       //case _OPMORE:  {tempvalue=asmpopvalue();   asmpushbool((UINT)asmpopvalue() >  (UINT)tempvalue); goto loop;}
  203.       //case _OPMOREEQ:{tempvalue=asmpopvalue();   asmpushbool((UINT)asmpopvalue() >= (UINT)tempvalue); goto loop;}
  204.       case _OPINV:   {                           asmpushvalue(~asmpopvalue()); goto loop;} //==invbool
  205. */
  206.       //case _OPPEEK:{/**asmpopvalue();*/ errstr("PEEK not supported"); enderr(); goto loop;}
  207.  
  208.       case _TOKEOL: {INC _curlnbeg; goto loop;}
  209.       case _TOKEOF: {IF (_ninclfiles==0x00) {goto endloop;/**exit!!!*/}ELSE goto inclq;} //todo break
  210.  
  211.       case _TOKPLUS/**'+'*/:
  212.       case _TOKMINUS/**'-'*/:
  213.       case _TOKSTAR/**'*'*/:
  214.       case _TOKSLASH/**'/'*/:
  215.       case _TOKLESS/**'<'*/:
  216.       case _TOKMORE/**'>'*/:
  217.       case _TOKEQUAL/**'='*/:
  218.       case _TOKAND/**'&'*/:
  219.       case _TOKPIPE/**'|'*/:
  220.       case _TOKCARON/**'^'*/:
  221.       case _TOKTILDE/**'~'*/:
  222.       case _TOKEXCL/**'!'*/:
  223.       case _TOKPRIMESYM:
  224.       case _TOKDBLQUOTESYM:
  225.       case _TOKOPEN:
  226.       case _TOKOPENSQ:
  227.       case _TOKCLOSE:
  228.       case _TOKCLOSESQ:
  229.       case _TOKCOLON:
  230.       case _TOKDIRECT:
  231.       case _TOKSPC0:
  232.       case _TOKSPC1:
  233.       case _TOKSPC2:
  234.       case _TOKSPC3:
  235.       case _TOKSPC4:
  236.       case _TOKSPC5:
  237.       case _TOKSPC6:
  238.       case _TOKSPC7:
  239.       case _TOKSPC8:
  240.  
  241.         {goto loop;}
  242.  
  243.       case _TOKPRIME: {
  244.         readfin(); //text
  245.         asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  246.         asmpushvalue((LONG)_prefixedtoken);
  247.         readfin(); //endtext
  248.         readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
  249.         goto loop;
  250.       }
  251.       case _TOKDOLLAR: {asmpushvalue((LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR; goto loop;}
  252.  
  253.       case _TOKCOMMENT: { /**skip cmt text*/
  254.         REPEAT {
  255.           _token=readfin();
  256.         }UNTIL ((_token==+_TOKENDCOMMENT)||_waseof); /**Єюъхэ, ъюЄюЁ√щ эх тёЄЁхўрхЄё  т ЄхъёЄрї*/
  257.         goto loop;
  258.       }
  259.       case _TOKNUM: {
  260.         rdnum();
  261.         goto loop;
  262.       }
  263.       case _TOKLABEL: { //эрщЄш ш яЁюўшЄрЄ№ ьхЄъє
  264.         readlabel();
  265.         _plabel_index = findlabel(_curlabeltext);
  266.         asmpushvalue(getlabel());
  267.         goto loop;
  268.       }
  269.       case _ERR: {
  270.         _token=readfin();
  271.         IF       (_token==+_ERRCMD) {errstr("badcmd \""); goto err;
  272.         }ELSE IF (_token==+_ERREXPR) {errstr("badexpr \""); goto err;
  273.         }ELSE IF (_token==+_ERRCOMMA) {errstr("need \',\' \""); goto err;
  274.         }ELSE IF (_token==+_ERRPAR) {errstr("badpar \""); goto err;
  275.         }ELSE IF (_token==+_ERROPEN) {errstr("need \'(\'/\'[\' \""); goto err;
  276.         }ELSE IF (_token==+_ERRCLOSE) {errstr("need \')\'/\']\' \""); goto err;
  277.         }ELSE IF (_token==+_ERRREG) {errstr("badreg \"");
  278.           err:
  279.           asmerrtext(); goto loop;
  280.         };
  281.       }
  282.  
  283.       case _OPWRSTR: { //фю эхую quotesymbol
  284.         //чряшёрЄ№ ёЄЁюъє тэєЄЁш text...endtext
  285.         _token = readfin(); //TOK_TEXT
  286.         writestringloop:
  287.           asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  288.           IF ((_token==+_TOKENDTEXT)||_waseof) goto loop; //BREAK;
  289.           //IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
  290. #ifdef TARGET_SCRIPT
  291.           asmpushvalue((LONG)_prefixedtoken);
  292.           asmbytepopvalue();
  293. #else
  294.           asmbyte(_prefixedtoken);
  295. #endif
  296.           goto writestringloop;
  297.       }
  298.       case _OPWRVAL: { //ёЄюшЄ яюёых т√Ёрцхэш 
  299.         IF       (_curdir==+_CMDDB) {asmbytepopvalue();
  300.         }ELSE IF (_curdir==+_CMDDW) {asmwordpopvalue();
  301.         }ELSE IF (_curdir==+_CMDDL) {asmlong((LONG)asmpopvalue());
  302.         };
  303.         goto loop;
  304.       }
  305.  
  306.       //case _TOKTEXT: {errstr("TEXT"); enderr(); /**format error*/ goto loop;}
  307.       //case _TOKENDTEXT: {errstr("ENDTEXT"); enderr(); /**format error*/ goto loop;}
  308.       //case _TOKENDCOMMENT: {errstr("ENDCOMMENT"); enderr(); /**format error*/ goto loop;}
  309.       //case _TOKENDERR: {errstr("ENDERR"); enderr(); goto loop;}
  310.