//// 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_THUMB
#include "asmf_arm.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш
#else
#include "asmf_z80.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш
#endif
PROC rdnum()
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
VAR UINT scale; //яюърчрЄхы№ ёшёЄхь√ ёўшёыхэш
readfin(); //TOK_TEXT
_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 (_token!=+_TOKENDTEXT) {
scale=8;
errstr("Use 0o oct"); enderr();
};
};
IF (_token!=+_TOKENDTEXT) {
rdnumloop: //WHILE (+TRUE)
{ //яхЁтр ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
IF ((_token==+_TOKENDTEXT)||_waseof) goto rdnumend; //BREAK;
//IF (_waseof) goto rdnumend; //BREAK; //эр тё ъшщ ёыєўрщ
IF ((CHAR)_token!='L') {
IF (_token>=(BYTE)'a') {_token = _token - 0x27/**- (BYTE)'a' + 0x0a + (BYTE)'0'*/; //todo error
}ELSE IF (_token>=(BYTE)'A') {_token = _token - 0x07/**- (BYTE)'A' + 0x0a + (BYTE)'0'*/; //todo error
#ifdef TARGET_SCRIPT
}ELSE IF (_token==(BYTE)'.') { //float
fexp = 0L;
fexpminus = +FALSE;
ffraction = 0L;
ffractionscale = 1L;
_token = readfin();
IF (_token!=+_TOKENDTEXT) {
rdfloatloop:
{ //яхЁтр ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
//printf("ffraction = %lf\n",(double)ffraction);
IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
//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;
IF (_token=='-') { //TODO
fexpminus = +TRUE;
_token = readfin();
};
//printf("fexp = %u, token = %c\n",(unsigned int)fexp, _token);
IF (_token!=+_TOKENDTEXT) {
rdexploop:
{ //яхЁтр ЎшЇЁр ¤ъёяюэхэЄ√ єцх яЁюўшЄрэр
//printf("fexp = %u\n",(unsigned int)fexp);
IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
fexp = fexp*10L + (LONG)(_token - (BYTE)'0');
_token = readfin();
goto rdexploop;
}
};
goto rdfloatend; //BREAK;
};
};
ffraction = ffraction*10L + (LONG)(_token - (BYTE)'0');
ffractionscale = ffractionscale*10L;
//ffraction += (float)(_token - (BYTE)'0')*ffractionscale;
_token = readfin();
goto rdfloatloop;
};
};
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 _token = _token - (BYTE)'0';
tempvalue = (LONG)scale*tempvalue + (LONG)(_token - (BYTE)'0');
};
_token = readfin();
goto rdnumloop;
};
rdnumend:;
};
asmpushvalue(tempvalue);
}
PROC doexpr RECURSIVE FORWARD();
PROC doval RECURSIVE() //ўшЄрхь чэрўхэшх (ўшёыю шыш ьхЄъє, шыш TODO т√Ёрцхэшх т ёъюсърї)
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
{
//;;printf("doval\n");
dovalloop:
_token = readfin();
// IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||_waseof) goto dovalq; //BREAK;
IF (_token==+_TOKNUM) {
//;;printf("valTOKNUM\n");
rdnum();
//goto doexprlooptok;
}ELSE IF (_token==+_TOKLABEL) {
//;;printf("valTOKLABEL\n");
readlabel();
_plabel_index = findlabel(_curlabeltext);
asmpushvalue(getlabel());
//goto doexprlooptok;
}ELSE IF (_token==+_TOKMINUS) {
//;;printf("valTOKMINUS\n");
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==+_TOKPLUS) {
//;;printf("valTOKPLUS\n");
//doval();
goto dovalloop;
}ELSE IF (_token==+_TOKDOLLAR) {
//;;printf("valTOKDOLLAR\n");
asmpushvalue((LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR;
}ELSE IF (_token==+_TOKPRIME) {
//;;printf("valTOKPRIME\n");
readfin(); //text
asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
asmpushvalue((LONG)_prefixedtoken);
readfin(); //endtext
readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
}ELSE IF (_token==+_TOKOPEN) {
//;;printf("valTOKOPEN\n");
doexpr();
}ELSE IF (_token==+_TOKTILDE) {
//;;printf("valTOKTILDE\n");
//TODO _TOKEXCL
//TODO _TOKSTAR (PEEK)
doval();
asmpushvalue(~asmpopvalue());
}ELSE {
;;printf("?valTOK %d\n",(UINT
)_token
);
goto dovalloop;
};
//;;printf("dovalq\n");
}
}
PROC doexpr RECURSIVE()
{
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
{
//goto doexprq;
//ўшЄрхь фю _TOKENDEXPR
//т яхЁтющ тхЁёшш ёўшЄрхь ёыхтр эряЁртю
//яЁюсхы√ шуэюЁшЁєхь (TODO юЄъєфр юэш т ъюэЎх т√Ёрцхэш яхЁхф ъюььхэЄрЁшхь?): +_TOKSPC0 ... +_TOKSPC0+_ASMMAXSPC-1
//ёъюсъш шуэюЁшЁєхь: +_TOKOPEN, +_TOKCLOSE
//шуэюЁшЁєхь юяхЁрЎшш: +_OPADD, +_OPSUB, +_OPMUL...
//ўшёыю: +_TOKNUM, +_TOKTEXT, <фрээ√х>, +_TOKENDTEXT
//ьхЄър: +_TOKLABEL, +_TOKTEXT, <фрээ√х>, +_TOKENDTEXT
//чрърт√ўхээ√щ срщЄ: +_TOKPRIME, <фрээ√х>, +_TOKPRIME
//$: +_TOKDOLLAR
//+: _TOKPLUS
//-: _TOKMINUS
//*: +_TOKSTAR
//_token = readfin(); //_TOKTEXT //т сєфє∙хь TODO
//;;printf("doexpr addr=%d\n",_curaddr);
doval(); //яхЁт√щ ярЁрьхЄЁ
doexprloop:
_token = readfin(); //юяхЁрЎш шыш ъюэхЎ
IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||(_token==+_TOKCLOSE)||_waseof) goto doexprq; //BREAK;
IF (_token==+_TOKPLUS) {
//;;printf("TOKPLUS\n");
doval();
asmpushvalue(asmpopvalue()+asmpopvalue());
}ELSE IF (_token==+_TOKMINUS) {
//;;printf("TOKMINUS\n");
doval();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
}ELSE IF (_token==+_TOKSTAR) {
//;;printf("TOKSTAR\n");
doval();
asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00;
}ELSE IF (_token==+_TOKSLASH) {
//;;printf("TOKSLASH\n");
doval();
tempvalue=asmpopvalue();
{
;;IF (tempvalue!=0L)
asmpushvalue(asmpopvalue()/tempvalue);
}
}ELSE IF (_token==+_TOKMORE) {
//;;printf("TOKMORE\n");
readfin(); //+_TOKMORE (2-щ)
//TODO >, >=
doval();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()>>tempvalue);
}ELSE IF (_token==+_TOKLESS) {
//;;printf("TOKLESS\n");
//TODO <, <=
//TODO _TOKEQUAL, _TOKEXPL (!=)
readfin(); //+_TOKLESS (2-щ)
doval();
tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()<<tempvalue);
}ELSE IF (_token==+_TOKAND) {
//;;printf("TOKAND\n");
//TODO Єръцх фтющэ√х
doval();
asmpushvalue(asmpopvalue()&asmpopvalue());
}ELSE IF (_token==+_TOKPIPE) {
//;;printf("TOKPIPE\n");
//TODO Єръцх фтющэ√х
doval();
asmpushvalue(asmpopvalue()|asmpopvalue());
}ELSE IF (_token==+_TOKCARON) {
//;;printf("TOKCARON\n");
//TODO Єръцх фтющэ√х
doval();
asmpushvalue(asmpopvalue()^asmpopvalue());
}ELSE IF (_token==+_TOKSPC1) {
//;;printf("TOKSPC1\n",_curaddr);
}ELSE {
;;printf("?TOK %d\n",(UINT
)_token
);
};
goto doexprloop;
doexprq:
//TODO т ёыхфє■∙хщ тхЁёшш тёх _TOK... т√ъшэєЄ№ шч т√Ёрцхэш , юёЄртшЄ№ +_TOKEXPR, +_TOKTEXT(ёхщўрё эхЄ), <фрээ√х>, +_TOKENDTEXT(ёхщўрё эхЄ, Єюы№ъю _TOKENDEXPR)
}
}
PROC fsm()
{
#ifdef TARGET_SCRIPT
VAR double fvalue;
VAR LONG ffraction;
VAR LONG ffractionscale;
VAR LONG fexp;
VAR BOOL fexpminus;
#endif
VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
VAR UINT i;
loop:
_token = readfin();
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:;
}