Subversion Repositories NedoOS

Rev

Rev 8 | Rev 491 | Go to most recent revision | 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(+_TOKLABEL);
  157.             decltoken(+_TOKTEXT);
  158.             decltoken((BYTE)'_'); //todo <modname>?
  159.             decltoken(+_TOKENDTEXT);
  160.             decltoken(+_TOKPLUS/**'+'*/);
  161.             decltoken(+_TOKNUM);
  162.             decltoken(+_TOKTEXT);
  163.             emitn(i-_curbegin/**_BASEADDR*/);
  164.             fputs((PCHAR)_nbuf, _fdecl); //+_TOKENDTEXT==0
  165.             decltoken(+_TOKENDTEXT);
  166.             decltoken(+_OPADD);
  167.             decltoken(+_FMTREEQU);
  168.             decltoken(+_TOKEOL);
  169.           }; //
  170.         ;;}ELSE {err(+(CHAR)_token); enderr();
  171.         };
  172.         goto loop;
  173.       }
  174.  
  175.       case _OPPUSH0: {asmpushvalue(0L); /**readfin();*/ goto loop;}
  176.  
  177.       case _OPADD:   {                           asmpushvalue(asmpopvalue()+asmpopvalue()); goto loop;}
  178.       case _OPSUB:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()-tempvalue); goto loop;}
  179.       case _OPMUL:   {                           asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00; goto loop;}
  180.       case _OPDIV:   {
  181.         tempvalue=asmpopvalue();
  182.         {
  183.         ;;IF (tempvalue!=0L)
  184.           asmpushvalue(asmpopvalue()/tempvalue);
  185.         }
  186.         goto loop;
  187.       }
  188.       case _OPAND:   {                           asmpushvalue(asmpopvalue()&asmpopvalue()); goto loop;}
  189.       case _OPOR:    {                           asmpushvalue(asmpopvalue()|asmpopvalue()); goto loop;}
  190.       case _OPXOR:   {                           asmpushvalue(asmpopvalue()^asmpopvalue()); goto loop;}
  191.       case _OPSHL:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()<<tempvalue); goto loop;}
  192.       case _OPSHR:   {tempvalue=asmpopvalue();   asmpushvalue(asmpopvalue()>>tempvalue); goto loop;}
  193.       //case _OPEQ:    {                           asmpushbool((asmpopvalue()==asmpopvalue())); goto loop;} //шэрўх эхы№ч  т ыюу.т√Ёрцхэш ї шёяюы№чютрЄ№ ъюэёЄрэЄє TRUE (-1 шыш 1 эхяЁхфёърчєхью)
  194.       //case _OPNOTEQ: {                           asmpushbool((asmpopvalue()!=asmpopvalue())); goto loop;}
  195.       //case _OPLESS:  {tempvalue=asmpopvalue();   asmpushbool(+(UINT)asmpopvalue() <  +(UINT)tempvalue); goto loop;}
  196.       //case _OPLESSEQ:{tempvalue=asmpopvalue();   asmpushbool(+(UINT)asmpopvalue() <= +(UINT)tempvalue); goto loop;}
  197.       //case _OPMORE:  {tempvalue=asmpopvalue();   asmpushbool(+(UINT)asmpopvalue() >  +(UINT)tempvalue); goto loop;}
  198.       //case _OPMOREEQ:{tempvalue=asmpopvalue();   asmpushbool(+(UINT)asmpopvalue() >= +(UINT)tempvalue); goto loop;}
  199.       case _OPINV:   {                           asmpushvalue(~asmpopvalue()); goto loop;} //==invbool
  200.       //case _OPPEEK:{/**asmpopvalue();*/ errstr("PEEK not supported"); enderr(); goto loop;}
  201.  
  202.       case _TOKEOL: {INC _curlnbeg; goto loop;}
  203.       case _TOKEOF: {IF (_ninclfiles==0x00) {goto endloop;/**exit!!!*/}ELSE goto inclq;} //todo break
  204.  
  205.       case _TOKPLUS/**'+'*/:
  206.       case _TOKMINUS/**'-'*/:
  207.       case _TOKSTAR/**'*'*/:
  208.       case _TOKSLASH/**'/'*/:
  209.       case _TOKLESS/**'<'*/:
  210.       case _TOKMORE/**'>'*/:
  211.       case _TOKEQUAL/**'='*/:
  212.       case _TOKAND/**'&'*/:
  213.       case _TOKPIPE/**'|'*/:
  214.       case _TOKCARON/**'^'*/:
  215.       case _TOKTILDE/**'~'*/:
  216.       case _TOKEXCL/**'!'*/:
  217.       case _TOKPRIMESYM:
  218.       case _TOKDBLQUOTESYM:
  219.       case _TOKOPEN:
  220.       case _TOKOPENSQ:
  221.       case _TOKCLOSE:
  222.       case _TOKCLOSESQ:
  223.       case _TOKCOLON:
  224.       case _TOKDIRECT:
  225.       case _TOKSPC0:
  226.       case _TOKSPC1:
  227.       case _TOKSPC2:
  228.       case _TOKSPC3:
  229.       case _TOKSPC4:
  230.       case _TOKSPC5:
  231.       case _TOKSPC6:
  232.       case _TOKSPC7:
  233.       case _TOKSPC8:
  234.  
  235.         {goto loop;}
  236.  
  237.       case _TOKPRIME: {
  238.         readfin(); //text
  239.         asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  240.         asmpushvalue(+(LONG)_prefixedtoken);
  241.         readfin(); //endtext
  242.         readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
  243.         goto loop;
  244.       }
  245.       case _TOKDOLLAR: {asmpushvalue(+(LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR; goto loop;}
  246.  
  247.       case _TOKCOMMENT: { /**skip cmt text*/
  248.         REPEAT {
  249.           _token=readfin();
  250.         }UNTIL ((_token==+_TOKENDCOMMENT)||_waseof); /**Єюъхэ, ъюЄюЁ√щ эх тёЄЁхўрхЄё  т ЄхъёЄрї*/
  251.         goto loop;
  252.       }
  253.       case _TOKNUM: {
  254.         readfin(); //TOK_TEXT
  255.         _token = readfin(); //first digit or prefix (0x, 0b, 0)
  256.         tempvalue = 0L;
  257.         scale = 10;
  258.         IF (+(CHAR)_token=='0'){
  259.           _token=readfin(); //'x' (hex), 'b' (bin), 'o' (oct), else oct with error
  260.           IF       (+(CHAR)_token=='x') {
  261.             scale=16;
  262.             rdbase:
  263.             IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  264.           }ELSE IF (+(CHAR)_token=='b') {
  265.             scale=2;
  266.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  267.           }ELSE IF (+(CHAR)_token=='o') {
  268.             scale=8;
  269.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  270.           }ELSE IF (+(CHAR)_token=='L') { //0L
  271.           }ELSE IF (_token!=+_TOKENDTEXT) {
  272.             scale=8;
  273.             errstr("Use 0o oct"); enderr();
  274.           };
  275.         };
  276.         IF (_token!=+_TOKENDTEXT) {
  277.           rdnumloop: //WHILE (+TRUE)
  278.           { //яхЁтр  ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
  279.             IF ((_token==+_TOKENDTEXT)||_waseof) goto rdnumend; //BREAK;
  280.             //IF (_waseof) goto rdnumend; //BREAK; //эр тё ъшщ ёыєўрщ
  281.             IF (+(CHAR)_token!='L') {
  282.               IF (_token>=+(BYTE)'a') {_token = _token - 0x27/**- +(BYTE)'a' + 0x0a + +(BYTE)'0'*/; //todo error
  283.               }ELSE IF (_token>=+(BYTE)'A') {_token = _token - 0x07/**- +(BYTE)'A' + 0x0a + +(BYTE)'0'*/; //todo error
  284.               };//ELSE _token = _token - +(BYTE)'0';
  285.               tempvalue = (LONG)scale*tempvalue + (LONG)(_token - +(BYTE)'0');
  286.             };
  287.             _token = readfin();
  288.             goto rdnumloop;
  289.           };
  290.           rdnumend:;
  291.         };
  292.         asmpushvalue(tempvalue);
  293.         goto loop;
  294.       }
  295.       case _TOKLABEL: { //эрщЄш ш яЁюўшЄрЄ№ ьхЄъє
  296.         readlabel();
  297.         findlabel(_curlabeltext);
  298.         asmpushvalue(getlabel());
  299.         goto loop;
  300.       }
  301.       case _ERR: {
  302.         _token=readfin();
  303.         IF       (_token==+_ERRCMD) {errstr("badcmd \""); goto err;
  304.         }ELSE IF (_token==+_ERREXPR) {errstr("badexpr \""); goto err;
  305.         }ELSE IF (_token==+_ERRCOMMA) {errstr("need \',\' \""); goto err;
  306.         }ELSE IF (_token==+_ERRPAR) {errstr("badpar \""); goto err;
  307.         }ELSE IF (_token==+_ERROPEN) {errstr("need \'(\'/\'[\' \""); goto err;
  308.         }ELSE IF (_token==+_ERRCLOSE) {errstr("need \')\'/\']\' \""); goto err;
  309.         }ELSE IF (_token==+_ERRREG) {errstr("badreg \"");
  310.           err:
  311.           asmerrtext(); goto loop;
  312.         };
  313.       }
  314.  
  315.       case _OPWRSTR: { //фю эхую quotesymbol
  316.         //чряшёрЄ№ ёЄЁюъє тэєЄЁш text...endtext
  317.         _token = readfin(); //TOK_TEXT
  318.         writestringloop:
  319.           asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  320.           IF ((_token==+_TOKENDTEXT)||_waseof) goto loop; //BREAK;
  321.           //IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
  322.           asmbyte(_prefixedtoken);
  323.           goto writestringloop;
  324.       }
  325.       case _OPWRVAL: { //ёЄюшЄ яюёых т√Ёрцхэш 
  326.         IF       (_curdir==+_CMDDB) {asmbytepopvalue();
  327.         }ELSE IF (_curdir==+_CMDDW) {asmwordpopvalue();
  328.         }ELSE IF (_curdir==+_CMDDL) {asmlong(+(LONG)asmpopvalue());
  329.         };
  330.         goto loop;
  331.       }
  332.  
  333.       //case _TOKTEXT: {errstr("TEXT"); enderr(); /**format error*/ goto loop;}
  334.       //case _TOKENDTEXT: {errstr("ENDTEXT"); enderr(); /**format error*/ goto loop;}
  335.       //case _TOKENDCOMMENT: {errstr("ENDCOMMENT"); enderr(); /**format error*/ goto loop;}
  336.       //case _TOKENDERR: {errstr("ENDERR"); enderr(); goto loop;}
  337.