//// ёЄрэфрЁЄэ√х тхЄъш
case _CMDINCLUDE: {
_inclfile[_ninclfiles] = _fin;
INC _ninclfiles;
_lenfn = 0;
i = 0;
readfin(); //tab
readfin(); //"
_token = readfin(); //_TOKTEXT
inclfnloop:
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
IF ((_token==+_TOKENDTEXT)||_waseof) goto inclfnq; //BREAK;
//IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
_lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
IF ((CHAR)_token == '.') i = _lenfn;
goto inclfnloop;
inclfnq:
//_lenfn = strjoineol(_fn, 0, _fn, '.'); //terminator is not copied
//_lenfn = stradd(_fn, _lenfn, '.');
_lenfn = i; //after last dot
_lenfn = stradd(_fn, _lenfn, (CHAR)((BYTE)_fn[_lenfn]&0xdf));
_lenfn = stradd(_fn, _lenfn, '_');
_fn[_lenfn] = '\0';
readfin(); //"
_fin = nfopen(_fn, "rb");
IF (_fin != (PBYTE)0) {
goto loop;
///ё■фр яюярф╕ь т ъюэЎх Їрщыр
inclq:
}ELSE {
errstr("no "); errstr(_fn); enderr();
};
DEC _ninclfiles;
_fin = _inclfile[_ninclfiles];
_waseof = +FALSE;
goto loop;
}
case _CMDINCBIN: {
_lenfn = 0;
readfin(); //tab
readfin(); //"
_token = readfin(); //_TOKTEXT
incbfnloop:
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
IF ((_token==+_TOKENDTEXT)||_waseof) goto incbfnq; //BREAK;
//IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
_lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
goto incbfnloop;
incbfnq:
_fn[_lenfn] = '\0';
readfin(); //"
_fincb = nfopen(_fn, "rb");
IF (_fincb != (PBYTE)0) {
incbloop:
_token = readf(_fincb);
IF (_waseof) goto incbq; //BREAK;
asmbyte(_token);
goto incbloop;
incbq:
}ELSE {
errstr("no "); errstr(_fn); enderr();
};
_waseof = +FALSE;
goto loop;
}
//case _CMDREADSTATE: {asmreadstate(); goto loop;}
case _CMDLABEL: {
_isaddr = 0x00;
_curdir = _token;
asmdir_label(); //эхы№ч ёхщўрё яхЁхюяЁхфхы Є№! шэрўх эхы№ч label=label+1
goto looptok; //readlabel яЁюўшЄры ёыхфє■∙шщ Єюъхэ
}
case _CMDEXPORT: /**{
_lenfn = 0;
readfin(); //tab
readfin(); //TOK_LABEL
_token = readfin(); //_TOKTEXT
getexploop:
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
IF ((_token==+_TOKENDTEXT)||_waseof) goto getexpq; //BREAK;
//IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
_lenfn = stradd(_fn, _lenfn, (CHAR)_token); //asmbyte(_prefixedtoken);
goto getexploop;
getexpq:
_fn[_lenfn] = '\0';
goto loop;
}*/
case _CMDORG:
case _CMDDISP:
case _CMDDB:
case _CMDDW:
case _CMDDL:
case _CMDDS:
case _CMDALIGN:
{_isaddr = 0x00; _curdir=_token; goto loop;}
case _FMTREEQU: {
asmfmt_reequ();
goto loop;
}
case _FMTCMD: {
IF (_curdir == +_CMDLABEL) {
IF (_labelchanged) {
errstr("redef "); errstr((PCHAR)_curlabeltext); enderr();
};
}ELSE IF (_curdir == +_CMDORG) {
asmemitblock();
_curaddr = (UINT)asmpopvalue();
_curbegin = _curaddr;
#ifdef TARGET_THUMB
}ELSE IF (_curdir == +_CMDALIGN) {
//i = -(_curaddr+_curshift) & ((UINT)asmpopvalue()-1); //no bias "+1"
i = -(_curaddr+_curshift-_BIAS) & ((UINT)asmpopvalue()-1); //bias (thumb)
i = i;
WHILE (i!=0) {
asmbyte(0x00);
DEC i;
};
#endif
}ELSE IF (_curdir == +_CMDDISP) {
_curshift = (UINT)asmpopvalue() - _curaddr; //todo тыюцхээю
}ELSE IF (_curdir == +_CMDENT) {
_curshift = 0; //todo тыюцхээю
}ELSE IF (_curdir == +_CMDDB) {
}ELSE IF (_curdir == +_CMDDW) {
}ELSE IF (_curdir == +_CMDDL) {
}ELSE IF (_curdir == +_CMDDS) {
IF (_nvalues==0x02) {_token = (BYTE)asmpopvalue();
}ELSE _token=0x00;
i = (UINT)asmpopvalue();
WHILE (i != 0) {
asmbyte(_token);
DEC i;
};
//fwrite(+(PBYTE)&zeros, 1, i, _fout);
//_curaddr = _curaddr + i;
//todo while фы ds уЁєяя√ срщЄ, эю ЄЁєфэю сєфхЄ фюёЄрЄ№ шч ёЄхър
}ELSE IF (_curdir == +_CMDEXPORT) {
i = (UINT)asmpopvalue();
IF (_asms) { //ёухэхЁшЁютрЄ№ <_curlabeltext>=<?modname?>+<i-?base?>
decltoken(+_CMDLABEL);
//decltoken(+_TOKTEXT);
fputs((PCHAR
)_curlabeltext
, _fdecl
);
//decltoken(+_TOKENDTEXT);
decltoken((BYTE)'=');
decltoken(+_TOKEXPR);
decltoken((BYTE)'_'); //todo <modname>?
decltoken((BYTE)'+');
emitn(i-_curbegin/**_BASEADDR*/);
fputs((PCHAR
)_nbuf
, _fdecl
); //+_TOKENDTEXT==0
decltoken(+_TOKENDEXPR);
decltoken(+_FMTREEQU);
decltoken(+_TOKEOL);
}; //
;;}ELSE {err((CHAR)_token); enderr();
};
goto loop;
}
case _TOKEXPR: {
_token = readfin(); //(фю тїюфр)
doexpr_();
goto loop;
}
case _TOKENDEXPR: {goto loop;}
//case _OPPEEK:{/**asmpopvalue();*/ errstr("PEEK not supported"); enderr(); goto loop;}
case _TOKEOL: {INC _curlnbeg; goto loop;}
case _TOKEOF: {IF (_ninclfiles==0x00) {goto endloop;/**exit!!!*/}ELSE goto inclq;} //todo break
case _TOKEQUAL: //=
case _TOKPRIME:
case _TOKDBLQUOTE: //" //TODO чрўхь?
case _TOKOPEN:
case _TOKOPENSQ:
case _TOKCLOSE:
case _TOKCLOSESQ:
case _TOKCOLON:
case _TOKDIRECT: //#
case _TOKSPC1:
case _TOKSPC2:
case _TOKSPC3:
case _TOKSPC4:
case _TOKSPC5:
case _TOKSPC6:
case _TOKSPC7:
case _TOKSPC8:
{goto loop;}
case _TOKCOMMENT: { /**skip cmt text*/
REPEAT {
_token=readfin();
}UNTIL ((_token==+_TOKEOL/**_TOKENDCOMMENT*/)||(_token==+_TOKEOF)/**||_waseof*/); /**Єюъхэ, ъюЄюЁ√щ эх тёЄЁхўрхЄё т ЄхъёЄрї*/
goto loop;
}
case _TOKLABEL: { //эрщЄш ш яЁюўшЄрЄ№ ьхЄъє //TODO єсЁрЄ№, эю ёхщўрё эєцэю!
_token=readfin(); //яхЁт√щ ёшьтюы ьхЄъш
readlabel();
_plabel_index = findlabel(_curlabeltext);
asmpushvalue(getlabel());
goto looptok; //readlabel яЁюўшЄры ёыхфє■∙шщ Єюъхэ
}
case _ERR: {
_token=readfin();
IF (_token==+_ERRCMD) {errstr("badcmd \""); goto err;
}ELSE IF (_token==+_ERREXPR) {errstr("badexpr \""); goto err;
}ELSE IF (_token==+_ERRCOMMA) {errstr("need \',\' \""); goto err;
}ELSE IF (_token==+_ERRPAR) {errstr("badpar \""); goto err;
}ELSE IF (_token==+_ERROPEN) {errstr("need \'(\'/\'[\' \""); goto err;
}ELSE IF (_token==+_ERRCLOSE) {errstr("need \')\'/\']\' \""); goto err;
}ELSE IF (_token==+_ERRREG) {errstr("badreg \"");
err:
asmerrtext(); goto loop;
};
}
case _OPWRSTR: { //фю эхую quotesymbol
//чряшёрЄ№ ёЄЁюъє тэєЄЁш text...endtext
_token = readfin(); //_TOKTEXT
writestringloop:
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
IF ((_token==+_TOKENDTEXT)||_waseof) goto loop; //BREAK;
//IF (_waseof) BREAK; //эр тё ъшщ ёыєўрщ
#ifdef TARGET_SCRIPT
asmpushvalue((LONG)_prefixedtoken);
asmbytepopvalue();
#else
asmbyte(_prefixedtoken);
#endif
goto writestringloop;
}
case _OPWRVAL: { //ёЄюшЄ яюёых т√Ёрцхэш
IF (_curdir==+_CMDDB) {asmbytepopvalue();
}ELSE IF (_curdir==+_CMDDW) {asmwordpopvalue();
}ELSE IF (_curdir==+_CMDDL) {asmlong((LONG)asmpopvalue());
};
goto loop;
}
//case _TOKTEXT: {errstr("TEXT"); enderr(); /**format error*/ goto loop;}
//case _TOKENDTEXT: {errstr("ENDTEXT"); enderr(); /**format error*/ goto loop;}
//case _TOKENDCOMMENT: {errstr("ENDCOMMENT"); enderr(); /**format error*/ goto loop;}
//case _TOKENDERR: {errstr("ENDERR"); enderr(); goto loop;}