//// imported
#include "../_sdk/io.h"
#include "../_sdk/str.h" //stradd, strjoineol
#include "../_sdk/emit.h"
#ifdef TARGET_SCRIPT
#include <math.h>
#endif
EXTERN BYTE _token; //Єхъє∙шщ ёўшЄрээ√щ Єюъхэ
EXTERN BYTE _prefixedtoken; //Ёрё°шЇЁютрээ√щ Єюъхэ ё єў╕Єюь \n ш Є.я.
EXTERN BYTE _curdir; //Єюъхэ Єхъє∙хщ юсЁрсрЄ√трхьющ фшЁхъЄшт√ рёёхьсыхЁр (эєцэю фы яЁртшы№эющ юсЁрсюЄъш ЇюЁьрЄр)
EXTERN BOOL _labelchanged; //Їыру "шчьхэшыш ьхЄъє" - эєцэю фы ю°шсъш яю LABEL (эю эх яю REEQU)
EXTERN LONG _value[_MAXVALS];
EXTERN PBYTE _inclfile[_MAXINCLUDES];
EXTERN UINT _curlnbeg; //эюьхЁ ёЄЁюъш эр ьюьхэЄ эрўрыр Єюъхэр
EXTERN BYTE _reg; //яюёыхфэшщ ЁхушёЄЁ
EXTERN BYTE _oldreg; //яЁхф√фє∙шщ ЁхушёЄЁ
EXTERN BYTE _base; //срчр ъюфр ъюьрэф√
EXTERN BYTE _base2; //срчр2 ъюфр ъюьрэф√ (фы єёыютэ√ї яхЁхїюфют)
EXTERN BYTE _nvalues; //ўшёыю чэрўхэшщ т ёЄхъх
EXTERN BYTE _ninclfiles; //ўшёыю юЄъЁ√Є√ї Їрщыют
EXTERN UINT _curaddr; //рфЁхё, ъєфр яш°хь
EXTERN UINT _curshift; //$=(_curaddr+curshift), curshift=(disp-_curaddr)
EXTERN UINT _curbegin; //эрўры№э√щ рфЁхё сыюър, ъєфр яш°хь
//EXTERN BYTE _curpage0;
//EXTERN BYTE _curpage1;
//EXTERN BYTE _curpage2;
//EXTERN BYTE _curpage3;
EXTERN PBYTE _pstr; //ьхЄър т ёЄЁюъх чрърэўштрхЄё TOK_ENDTEXT
EXTERN PBYTE _curlabeltext;
EXTERN PBYTE _evallabeltext;
EXTERN PCHAR _fn;
EXTERN UINT _lenfn;
PROC asmpushvalue FORWARD(LONG value);
PROC asmpushbool FORWARD(BOOL b);
FUNC LONG asmpopvalue FORWARD();
//PROC asmwritestate FORWARD();
//PROC asmreadstate FORWARD();
PROC readlabel FORWARD();
FUNC UINT findlabel FORWARD(PBYTE labeltext);
FUNC LONG getlabel FORWARD(); //т√ч√трЄ№ эхяюёЁхфёЄтхээю яюёых findlabel!!!
PROC errwrongreg FORWARD();
PROC errwrongpar FORWARD();
PROC asmerrtext FORWARD();
PROC asmbyte FORWARD(BYTE _token);
PROC asmemitblock FORWARD(); //чряшёрЄ№ рфЁхёр сыюър org
PROC asmdir_label FORWARD();
PROC asmfmt_reequ FORWARD();
PROC asmreadprefixed FORWARD();
EXTERN PBYTE _fincb;
EXTERN BOOL _asms;
PROC decltoken FORWARD(BYTE bb);
PROC decldig FORWARD(UINT d);
EXTERN PBYTE _forg;
EXTERN PBYTE _fdecl;
EXTERN BYTE _isaddr; //ьрёър "т т√Ёрцхэшш шёяюы№чютрыё рфЁхё"
EXTERN UINT _plabel_index; //яюёых findlabel ёюфхЁцшЄ єърчрЄхы№ эр эрўрыю фрээ√ї ьхЄъш
#ifdef TARGET_SCRIPT
VAR double fvalue;
VAR LONG fexp;
VAR BOOL fexpminus;
VAR LONG ffraction;
VAR LONG ffractionscale;
#endif
#ifdef TARGET_THUMB
#include "asmf_arm.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш
#else
#include "asmf_z80.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш
#endif
PROC rdnum_()
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
VAR UINT scale; //яюърчрЄхы№ ёшёЄхь√ ёўшёыхэш
//readfin(); //_TOKTEXT (TODO фю тїюфр)
//_token = readfin(); //first digit or prefix (0x, 0b, 0)
tempvalue = 0L;
scale = 10;
IF ((CHAR)_token=='0'){
_token=readfin(); //'x' (hex), 'b' (bin), 'o' (oct), else oct with error
IF ((CHAR)_token=='x') {
scale=16;
rdbase:
/**IF (_token!=+_TOKENDTEXT)*/ _token=readfin(); //first digit
}ELSE IF ((CHAR)_token=='b') {
scale=2;
goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
}ELSE IF ((CHAR)_token=='o') {
scale=8;
goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
//}ELSE IF ((CHAR)_token=='L') { //0L
//}ELSE IF ((CHAR)_token=='.') { //0.
}ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) { //0..9
scale=8;
errstr("Use 0o oct"); enderr();
};
};
//IF (_token!=+_TOKENDTEXT) { //TODO 0..9a..f (L юсёыєцшЄ№ тэх Ўшъыр)
rdnumloop: //WHILE (+TRUE)
//{ //яхЁтр ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
//IF ((_token==+_TOKENDTEXT)||_waseof) goto rdnumend; //BREAK;
IF (_waseof) goto rdnumend; //BREAK; //эр тё ъшщ ёыєўрщ
IF ((CHAR)_token!='L')
{
IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {_token = _token - 0x30;
}ELSE IF ((BYTE)(((BYTE)_token|0x20) - (BYTE)'a') < 0x06) {_token = (_token|0x20) - 0x57;
// IF ((_token>=0x30)&&(_token<0x3a)) {_token = _token - 0x30;
// }ELSE IF ((_token>=(BYTE)'a')&&(_token<0x7b)) {_token = _token - 0x57;
// }ELSE IF ((_token>=(BYTE)'A')&&(_token<0x5b)) {_token = _token - 0x37;
#ifdef TARGET_SCRIPT
}ELSE IF (_token==(BYTE)'.') { //float
//printf("float %d",_token);
fexp = 0L;
fexpminus = +FALSE;
ffraction = 0L;
ffractionscale = 1L;
_token = readfin();
//IF (_token!=+_TOKENDTEXT) { //TODO 0..9a..f
IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {
rdfloatloop:
//printf("float: %d",_token);
//{ //яхЁтр ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
//printf("ffraction = %lf\n",(double)ffraction);
//IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK; //TODO 0..9
IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
//IF ((CHAR)_token!='f') { //???
IF (_token==(BYTE)'e') { //TODO e12/e-12
_token = readfin();
//IF (_token==+_TOKENDTEXT) goto rdfloatend; //BREAK; //TODO 0..9, +-
IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
IF (_token=='-') { //TODO
fexpminus = +TRUE;
_token = readfin();
};
//printf("fexp = %u, token = %c\n",(unsigned int)fexp, _token);
//IF (_token!=+_TOKENDTEXT) { //TODO 0..9
rdexploop:
//{ //яхЁтр ЎшЇЁр ¤ъёяюэхэЄ√ єцх яЁюўшЄрэр
//printf("fexp = %u\n",(unsigned int)fexp);
//IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
IF ((BYTE)((BYTE)_token - (BYTE)'0') >= 0x0a) goto rdfloatend; //BREAK;
fexp = fexp*10L + (LONG)(_token - (BYTE)'0');
_token = readfin();
goto rdexploop;
//}
//};
goto rdfloatend; //BREAK;
}ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') >= 0x0a) {
goto rdfloatend; //BREAK;
};
//}; //!='f'
ffraction = ffraction*10L + (LONG)(_token - (BYTE)'0');
ffractionscale = ffractionscale*10L;
//ffraction += (float)(_token - (BYTE)'0')*ffractionscale;
_token = readfin();
goto rdfloatloop;
//};
}; //0..9
rdfloatend:
fvalue = (double)tempvalue + (double)ffraction/(double)ffractionscale; //чэръ ЁрсюЄрхЄ ъръ юяхЁрЎш , Єръ ўЄю эх єўшЄ√трхь
IF (fexpminus) {
fvalue = fvalue/pow10(fexp);
}ELSE {
fvalue = fvalue*pow10(fexp);
};
//fvalue = 0.1415926536;
//printf("%ld\n",fexp);
//printf("%20.20lf\n",fvalue);
//printf("%20.20lf\n",0.1415926536);
tempvalue = *(LONG*)(&fvalue);
goto rdnumend;
#endif
}ELSE { //эх ЎшЇЁр ш эх .
goto rdnumend;
};
//tempvalue = (LONG)scale*tempvalue + (LONG)(_token - (BYTE)'0');
tempvalue = (LONG)scale*tempvalue + (LONG)_token;
}; //IF ((CHAR)_token!='L')
_token = readfin();
goto rdnumloop;
//};
rdnumend:;
//};
//IF ((CHAR)_token=='L') {_token = readfin();}; //Єръ эх ЁрсюЄрхЄ (яюўхьє?)
asmpushvalue(tempvalue);
}
PROC doexpr_ RECURSIVE FORWARD();
PROC doval_ RECURSIVE() //ўшЄрхь чэрўхэшх (ўшёыю шыш ьхЄъє, шыш TODO т√Ёрцхэшх т ёъюсърї)
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
{
//;;printf("doval\n");
dovalloop:
IF (_token==(BYTE)'-') {
//;;printf("valTOKMINUS\n");
_token = readfin(); //(фю тїюфр)
doval_();
//asmpushvalue(0L-asmpopvalue()); //BUG!!! TODO fix!
//asmpushvalue(-asmpopvalue()); //BUG!!! TODO fix!
tempvalue=asmpopvalue(); asmpushvalue(0L-tempvalue);
//asmpushvalue(0L); tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
}ELSE IF (_token==(BYTE)'+') {
//;;printf("valTOKPLUS\n");
_token = readfin(); //(фю тїюфр)
goto dovalloop;
}ELSE IF (_token==(BYTE)'$') {
//;;printf("valTOKDOLLAR\n");
asmpushvalue((LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR;
_token = readfin(); //(фю тїюфр)
}ELSE IF (_token==+_TOKPRIME) {
//;;printf("valTOKPRIME\n");
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
asmpushvalue((LONG)_prefixedtoken);
readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
_token = readfin(); //(фю тїюфр)
}ELSE IF (_token==+_TOKOPEN) {
//;;printf("valTOKOPEN\n");
_token = readfin(); //(фю тїюфр)
doexpr_();
_token = readfin(); //(яюёых ёъюсъш)
}ELSE IF (_token==(BYTE)'~') {
//;;printf("valTOKTILDE\n");
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(~asmpopvalue());
}ELSE IF (_token==(BYTE)'!') {
//;;printf("valTOKEXCL\n");
//TODO _TOKSTAR (PEEK)
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(!asmpopvalue());
/** }ELSE IF (_token==+_TOKNUM) { //TODO єсЁрЄ№
_token = readfin(); //(фю тїюфр)
goto dovalloop;
}ELSE IF (_token==+_TOKTEXT) { //TODO єсЁрЄ№
_token = readfin(); //(фю тїюфр)
goto dovalloop;*/
}ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {
//;;printf("valTOKNUM\n");
//readfin(); //_TOKTEXT (фю тїюфр)
rdnum_();
//goto doexprlooptok;
}ELSE IF (_token==+_TOKDIRECT) { //for ARM
_token = readfin(); //(фю тїюфр)
goto dovalloop;
}ELSE /**IF (_token==+_TOKLABEL)*/ {
//;;printf("valTOKLABEL\n");
readlabel();
_plabel_index = findlabel(_curlabeltext);
asmpushvalue(getlabel());
}/**ELSE {
;;printf("?valTOK %d\n",(UINT)_token);
;;printf("addr=%d\n",_curaddr);
_token = readfin(); //(фю тїюфр)
goto dovalloop;
}*/;
//;;printf("dovalq\n");
}
}
PROC doexpr_ RECURSIVE()
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
{
//ўшЄрхь фю _TOKENDEXPR
//т яхЁтющ тхЁёшш ёўшЄрхь ёыхтр эряЁртю
//TODO switch? шыш яЁш эхёъюы№ъшї єЁютэ ї тыюцхээюёЄш юёЄрэхЄё т ърцфюь ьрыю
//яЁюсхы√ шуэюЁшЁєхь (TODO юЄъєфр юэш т ъюэЎх т√Ёрцхэш яхЁхф ъюььхэЄрЁшхь?): +_TOKSPC0 ... +_TOKSPC0+_ASMMAXSPC-1
//ўшёыю: <фрээ√х>
//ьхЄър: <фрээ√х>
//чрърт√ўхээ√щ срщЄ: +_TOKPRIME, <фрээ√х>, +_TOKPRIME
//$: +_TOKDOLLAR
//+: _TOKPLUS
//-: _TOKMINUS
//*: +_TOKSTAR
//;;printf("doexpr addr=%d\n",_curaddr);
doval_(); //яхЁт√щ ярЁрьхЄЁ
doexprloop:
//;;printf("exprTOK %d\n",(UINT)_token);
IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||(_token==+_TOKCLOSE)||_waseof) goto doexprq; //BREAK;
IF (_token==(BYTE)'+') {
//;;printf("TOKPLUS\n");
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(asmpopvalue()+asmpopvalue());
}ELSE IF (_token==(BYTE)'-') {
//;;printf("TOKMINUS\n");
_token = readfin(); //(фю тїюфр)
doval_();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
}ELSE IF (_token==(BYTE)'*') {
//;;printf("TOKSTAR\n");
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00;
}ELSE IF (_token==(BYTE)'/') {
//;;printf("TOKSLASH\n");
_token = readfin(); //(фю тїюфр)
doval_();
tempvalue=asmpopvalue();
{
;;IF (tempvalue!=0L)
asmpushvalue(asmpopvalue()/tempvalue);
}
}ELSE IF (_token==(BYTE)'>') {
//;;printf("TOKMORE\n");
readfin(); //+_TOKMORE (2-щ)
//TODO >, >=
_token = readfin(); //(фю тїюфр)
doval_();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()>>tempvalue);
}ELSE IF (_token==(BYTE)'<') {
//;;printf("TOKLESS\n");
//TODO <, <=
//TODO _TOKEQUAL, _TOKEXPL (!=)
readfin(); //+_TOKLESS (2-щ)
_token = readfin(); //(фю тїюфр)
doval_();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()<<tempvalue);
}ELSE IF (_token==(BYTE)'&') {
//;;printf("TOKAND\n");
//TODO Єръцх фтющэ√х
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(asmpopvalue()&asmpopvalue());
}ELSE IF (_token==(BYTE)'|') {
//;;printf("TOKPIPE\n");
//TODO Єръцх фтющэ√х
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(asmpopvalue()|asmpopvalue());
}ELSE IF (_token==(BYTE)'^') {
//;;printf("TOKCARON\n");
//TODO Єръцх фтющэ√х
_token = readfin(); //(фю тїюфр)
doval_();
asmpushvalue(asmpopvalue()^asmpopvalue());
}ELSE IF ((_token-+_TOKSPC1) < 0x08) {
//;;printf("TOKSPC1\n",_curaddr);
_token = readfin(); //(фю тїюфр)
}ELSE {
//TODO ==, !=
;;printf("?TOK %d\n",(UINT
)_token
);
;;printf("addr=%d\n",_curaddr
);
_token = readfin(); //(фю тїюфр)
};
goto doexprloop;
doexprq:
//;;printf("doexprq\n");
}
}
PROC fsm()
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
VAR UINT i;
loop:
_token = readfin();
looptok:
switch (_token) {
#include "asmj.c" //// ёЄрэфрЁЄэ√х тхЄъш
#ifdef TARGET_THUMB
#include "asmj_arm.c" //// ьр°шээючртшёшь√х тхЄъш
#else
#include "asmj_z80.c" //// ьр°шээючртшёшь√х тхЄъш
#endif
default : {err((CHAR)_token); enderr(); goto loop;}
};
endloop:;
}