Subversion Repositories NedoOS

Rev

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

  1. //// imported
  2. #include "../_sdk/io.h"
  3. #include "../_sdk/str.h" //stradd, strjoineol
  4. #include "../_sdk/emit.h"
  5.  
  6. #ifdef TARGET_SCRIPT
  7. #include <math.h>
  8. #endif
  9.  
  10. EXTERN BYTE _token; //Єхъє∙шщ ёўшЄрээ√щ Єюъхэ
  11. EXTERN BYTE _prefixedtoken; //Ёрё°шЇЁютрээ√щ Єюъхэ ё єў╕Єюь \n ш Є.я.
  12. EXTERN BYTE _curdir; //Єюъхэ Єхъє∙хщ юсЁрсрЄ√трхьющ фшЁхъЄшт√ рёёхьсыхЁр (эєцэю фы  яЁртшы№эющ юсЁрсюЄъш ЇюЁьрЄр)
  13. EXTERN BOOL _labelchanged; //Їыру "шчьхэшыш ьхЄъє" - эєцэю фы  ю°шсъш яю LABEL (эю эх яю REEQU)
  14. EXTERN LONG _value[_MAXVALS];
  15. EXTERN PBYTE _inclfile[_MAXINCLUDES];
  16.  
  17. EXTERN UINT _curlnbeg; //эюьхЁ ёЄЁюъш эр ьюьхэЄ эрўрыр Єюъхэр
  18.  
  19. EXTERN BYTE _reg; //яюёыхфэшщ ЁхушёЄЁ
  20. EXTERN BYTE _oldreg; //яЁхф√фє∙шщ ЁхушёЄЁ
  21. EXTERN BYTE _base; //срчр ъюфр ъюьрэф√
  22. EXTERN BYTE _base2; //срчр2 ъюфр ъюьрэф√ (фы  єёыютэ√ї яхЁхїюфют)
  23.  
  24. EXTERN BYTE _nvalues; //ўшёыю чэрўхэшщ т ёЄхъх
  25. EXTERN BYTE _ninclfiles; //ўшёыю юЄъЁ√Є√ї Їрщыют
  26.  
  27. EXTERN UINT _curaddr; //рфЁхё, ъєфр яш°хь
  28. EXTERN UINT _curshift; //$=(_curaddr+curshift), curshift=(disp-_curaddr)
  29. EXTERN UINT _curbegin; //эрўры№э√щ рфЁхё сыюър, ъєфр яш°хь
  30. //EXTERN BYTE _curpage0;
  31. //EXTERN BYTE _curpage1;
  32. //EXTERN BYTE _curpage2;
  33. //EXTERN BYTE _curpage3;
  34.  
  35. EXTERN PBYTE _pstr; //ьхЄър т ёЄЁюъх чрърэўштрхЄё  TOK_ENDTEXT
  36. EXTERN PBYTE _curlabeltext;
  37. EXTERN PBYTE _evallabeltext;
  38. EXTERN PCHAR _fn;
  39. EXTERN UINT _lenfn;
  40.  
  41. PROC asmpushvalue FORWARD(LONG value);
  42. PROC asmpushbool FORWARD(BOOL b);
  43. FUNC LONG asmpopvalue FORWARD();
  44. //PROC asmwritestate FORWARD();
  45. //PROC asmreadstate FORWARD();
  46. PROC readlabel FORWARD();
  47. FUNC UINT findlabel FORWARD(PBYTE labeltext);
  48. FUNC LONG getlabel FORWARD(); //т√ч√трЄ№ эхяюёЁхфёЄтхээю яюёых findlabel!!!
  49. PROC errwrongreg FORWARD();
  50. PROC errwrongpar FORWARD();
  51. PROC asmerrtext FORWARD();
  52. PROC asmbyte FORWARD(BYTE _token);
  53. PROC asmemitblock FORWARD(); //чряшёрЄ№ рфЁхёр сыюър org
  54. PROC asmdir_label FORWARD();
  55. PROC asmfmt_reequ FORWARD();
  56.  
  57. PROC asmreadprefixed FORWARD();
  58.  
  59. EXTERN PBYTE _fincb;
  60. EXTERN BOOL _asms;
  61.  
  62. PROC decltoken FORWARD(BYTE bb);
  63. PROC decldig FORWARD(UINT d);
  64.  
  65. EXTERN PBYTE _forg;
  66. EXTERN PBYTE _fdecl;
  67.  
  68. EXTERN BYTE _isaddr; //ьрёър "т т√Ёрцхэшш шёяюы№чютрыё  рфЁхё"
  69.  
  70. EXTERN UINT _plabel_index; //яюёых findlabel ёюфхЁцшЄ єърчрЄхы№ эр эрўрыю фрээ√ї ьхЄъш
  71.  
  72. #ifdef TARGET_THUMB
  73. #include "asmf_arm.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
  74. #else
  75. #include "asmf_z80.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
  76. #endif
  77.  
  78. PROC rdnum()
  79. {
  80. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  81. VAR UINT scale; //яюърчрЄхы№ ёшёЄхь√ ёўшёыхэш 
  82.         readfin(); //TOK_TEXT
  83.         _token = readfin(); //first digit or prefix (0x, 0b, 0)
  84.         tempvalue = 0L;
  85.         scale = 10;
  86.         IF ((CHAR)_token=='0'){
  87.           _token=readfin(); //'x' (hex), 'b' (bin), 'o' (oct), else oct with error
  88.           IF       ((CHAR)_token=='x') {
  89.             scale=16;
  90.             rdbase:
  91.             IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  92.           }ELSE IF ((CHAR)_token=='b') {
  93.             scale=2;
  94.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  95.           }ELSE IF ((CHAR)_token=='o') {
  96.             scale=8;
  97.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  98.           }ELSE IF ((CHAR)_token=='L') { //0L
  99.           }ELSE IF ((CHAR)_token=='.') { //0.
  100.           }ELSE IF (_token!=+_TOKENDTEXT) {
  101.             scale=8;
  102.             errstr("Use 0o oct"); enderr();
  103.           };
  104.         };
  105.         IF (_token!=+_TOKENDTEXT) {
  106.           rdnumloop: //WHILE (+TRUE)
  107.           { //яхЁтр  ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
  108.             IF ((_token==+_TOKENDTEXT)||_waseof) goto rdnumend; //BREAK;
  109.             //IF (_waseof) goto rdnumend; //BREAK; //эр тё ъшщ ёыєўрщ
  110.             IF ((CHAR)_token!='L') {
  111.               IF (_token>=(BYTE)'a') {_token = _token - 0x27/**- (BYTE)'a' + 0x0a + (BYTE)'0'*/; //todo error
  112.               }ELSE IF (_token>=(BYTE)'A') {_token = _token - 0x07/**- (BYTE)'A' + 0x0a + (BYTE)'0'*/; //todo error
  113. #ifdef TARGET_SCRIPT
  114.               }ELSE IF (_token==(BYTE)'.') { //float
  115.                 fexp = 0L;
  116.                 fexpminus = +FALSE;
  117.                 ffraction = 0L;
  118.                 ffractionscale = 1L;
  119.                 _token = readfin();
  120.                 IF (_token!=+_TOKENDTEXT) {
  121.                   rdfloatloop:
  122.                   { //яхЁтр  ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
  123.                     //printf("ffraction = %lf\n",(double)ffraction);
  124.                     IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
  125.                     //IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
  126.                     IF ((CHAR)_token!='f') {
  127.                       IF (_token==(BYTE)'e') { //TODO e12/e-12
  128.                         _token = readfin();
  129.                         IF (_token==+_TOKENDTEXT) goto rdfloatend; //BREAK;
  130.                         IF (_token=='-') { //TODO
  131.                           fexpminus = +TRUE;
  132.                           _token = readfin();
  133.                         };
  134.                         //printf("fexp = %u, token = %c\n",(unsigned int)fexp, _token);
  135.                         IF (_token!=+_TOKENDTEXT) {
  136.                           rdexploop:
  137.                           { //яхЁтр  ЎшЇЁр ¤ъёяюэхэЄ√ єцх яЁюўшЄрэр
  138.                             //printf("fexp = %u\n",(unsigned int)fexp);
  139.                             IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
  140.                             fexp = fexp*10L + (LONG)(_token - (BYTE)'0');
  141.                             _token = readfin();
  142.                             goto rdexploop;
  143.                           }
  144.                         };
  145.                         goto rdfloatend; //BREAK;
  146.                       };
  147.                     };
  148.                     ffraction = ffraction*10L + (LONG)(_token - (BYTE)'0');
  149.                     ffractionscale = ffractionscale*10L;
  150.                     //ffraction += (float)(_token - (BYTE)'0')*ffractionscale;
  151.                     _token = readfin();
  152.                     goto rdfloatloop;
  153.                   };
  154.                 };
  155.                 rdfloatend:
  156.                 fvalue = (double)tempvalue + (double)ffraction/(double)ffractionscale; //чэръ ЁрсюЄрхЄ ъръ юяхЁрЎш , Єръ ўЄю эх єўшЄ√трхь
  157.                 IF (fexpminus) {
  158.                   fvalue = fvalue/pow10(fexp);
  159.                 }ELSE {
  160.                   fvalue = fvalue*pow10(fexp);
  161.                 };
  162.                 //fvalue = 0.1415926536;
  163.                 //printf("%ld\n",fexp);
  164.                 //printf("%20.20lf\n",fvalue);
  165.                 //printf("%20.20lf\n",0.1415926536);
  166.                 tempvalue = *(LONG*)(&fvalue);
  167.                 goto rdnumend;
  168. #endif
  169.               };//ELSE _token = _token - (BYTE)'0';
  170.               tempvalue = (LONG)scale*tempvalue + (LONG)(_token - (BYTE)'0');
  171.             };
  172.             _token = readfin();
  173.             goto rdnumloop;
  174.           };
  175.           rdnumend:;
  176.         };
  177.         asmpushvalue(tempvalue);
  178. }
  179.  
  180. PROC doexpr RECURSIVE FORWARD();
  181.  
  182. PROC doval RECURSIVE() //ўшЄрхь чэрўхэшх (ўшёыю шыш ьхЄъє, шыш TODO т√Ёрцхэшх т ёъюсърї)
  183. {
  184. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  185. {
  186. //;;printf("doval\n");
  187. dovalloop:
  188.   _token = readfin();
  189. //  IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||_waseof) goto dovalq; //BREAK;
  190.   IF (_token==+_TOKNUM) {
  191. //;;printf("valTOKNUM\n");
  192.         rdnum();
  193.         //goto doexprlooptok;
  194.   }ELSE IF (_token==+_TOKLABEL) {
  195. //;;printf("valTOKLABEL\n");
  196.         readlabel();
  197.         _plabel_index = findlabel(_curlabeltext);
  198.         asmpushvalue(getlabel());
  199.         //goto doexprlooptok;
  200.   }ELSE IF (_token==+_TOKMINUS) {
  201. //;;printf("valTOKMINUS\n");
  202.         doval();
  203.         //asmpushvalue(0L-asmpopvalue()); //BUG!!! TODO fix!
  204.         //asmpushvalue(-asmpopvalue()); //BUG!!! TODO fix!
  205.         tempvalue=asmpopvalue(); asmpushvalue(0L-tempvalue);
  206.         //asmpushvalue(0L); tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
  207.   }ELSE IF (_token==+_TOKPLUS) {
  208. //;;printf("valTOKPLUS\n");
  209.         //doval();
  210.         goto dovalloop;
  211.   }ELSE IF (_token==+_TOKDOLLAR) {
  212. //;;printf("valTOKDOLLAR\n");
  213.         asmpushvalue((LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR;
  214.   }ELSE IF (_token==+_TOKPRIME) {
  215. //;;printf("valTOKPRIME\n");
  216.         readfin(); //text
  217.         asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  218.         asmpushvalue((LONG)_prefixedtoken);
  219.         readfin(); //endtext
  220.         readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
  221.   }ELSE IF (_token==+_TOKOPEN) {
  222. //;;printf("valTOKOPEN\n");
  223.         doexpr();
  224.   }ELSE IF (_token==+_TOKTILDE) {
  225. //;;printf("valTOKTILDE\n");
  226. //TODO _TOKEXCL
  227. //TODO _TOKSTAR (PEEK)
  228.         doval();
  229.         asmpushvalue(~asmpopvalue());
  230.   }ELSE {
  231. ;;printf("?valTOK %d\n",(UINT)_token);
  232.         goto dovalloop;
  233.   };
  234. //;;printf("dovalq\n");
  235. }
  236. }
  237.  
  238. PROC doexpr RECURSIVE()
  239. {
  240. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  241. {
  242.   //goto doexprq;
  243. //ўшЄрхь фю _TOKENDEXPR
  244. //т яхЁтющ тхЁёшш ёўшЄрхь ёыхтр эряЁртю
  245.  
  246. //яЁюсхы√ шуэюЁшЁєхь (TODO юЄъєфр юэш т ъюэЎх т√Ёрцхэш  яхЁхф ъюььхэЄрЁшхь?): +_TOKSPC0 ... +_TOKSPC0+_ASMMAXSPC-1
  247. //ёъюсъш шуэюЁшЁєхь: +_TOKOPEN, +_TOKCLOSE
  248. //шуэюЁшЁєхь юяхЁрЎшш: +_OPADD, +_OPSUB, +_OPMUL...
  249. //ўшёыю: +_TOKNUM, +_TOKTEXT, <фрээ√х>, +_TOKENDTEXT
  250. //ьхЄър: +_TOKLABEL, +_TOKTEXT, <фрээ√х>, +_TOKENDTEXT
  251. //чрърт√ўхээ√щ срщЄ: +_TOKPRIME, <фрээ√х>, +_TOKPRIME
  252. //$: +_TOKDOLLAR
  253. //+: _TOKPLUS
  254. //-: _TOKMINUS
  255. //*: +_TOKSTAR
  256.   //_token = readfin(); //_TOKTEXT //т сєфє∙хь TODO
  257. //;;printf("doexpr addr=%d\n",_curaddr);
  258.   doval(); //яхЁт√щ ярЁрьхЄЁ
  259. doexprloop:
  260.   _token = readfin(); //юяхЁрЎш  шыш ъюэхЎ
  261.   IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||(_token==+_TOKCLOSE)||_waseof) goto doexprq; //BREAK;
  262.   IF (_token==+_TOKPLUS) {
  263. //;;printf("TOKPLUS\n");
  264.         doval();
  265.         asmpushvalue(asmpopvalue()+asmpopvalue());
  266.   }ELSE IF (_token==+_TOKMINUS) {
  267. //;;printf("TOKMINUS\n");
  268.         doval();
  269.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
  270.   }ELSE IF (_token==+_TOKSTAR) {
  271. //;;printf("TOKSTAR\n");
  272.         doval();
  273.         asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00;
  274.   }ELSE IF (_token==+_TOKSLASH) {
  275. //;;printf("TOKSLASH\n");
  276.         doval();
  277.         tempvalue=asmpopvalue();
  278.         {
  279.         ;;IF (tempvalue!=0L)
  280.           asmpushvalue(asmpopvalue()/tempvalue);
  281.         }
  282.   }ELSE IF (_token==+_TOKMORE) {
  283. //;;printf("TOKMORE\n");
  284.         readfin(); //+_TOKMORE (2-щ)
  285. //TODO >, >=
  286.         doval();
  287.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()>>tempvalue);
  288.   }ELSE IF (_token==+_TOKLESS) {
  289. //;;printf("TOKLESS\n");
  290. //TODO <, <=
  291. //TODO _TOKEQUAL, _TOKEXPL (!=)
  292.         readfin(); //+_TOKLESS (2-щ)
  293.         doval();
  294.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()<<tempvalue);
  295.   }ELSE IF (_token==+_TOKAND) {
  296. //;;printf("TOKAND\n");
  297. //TODO Єръцх фтющэ√х
  298.         doval();
  299.         asmpushvalue(asmpopvalue()&asmpopvalue());
  300.   }ELSE IF (_token==+_TOKPIPE) {
  301. //;;printf("TOKPIPE\n");
  302. //TODO Єръцх фтющэ√х
  303.         doval();
  304.         asmpushvalue(asmpopvalue()|asmpopvalue());
  305.   }ELSE IF (_token==+_TOKCARON) {
  306. //;;printf("TOKCARON\n");
  307. //TODO Єръцх фтющэ√х
  308.         doval();
  309.         asmpushvalue(asmpopvalue()^asmpopvalue());
  310.   }ELSE IF (_token==+_TOKSPC1) {
  311. //;;printf("TOKSPC1\n",_curaddr);
  312.   }ELSE {
  313. ;;printf("?TOK %d\n",(UINT)_token);
  314.   };
  315.   goto doexprloop;
  316. doexprq:
  317. //TODO т ёыхфє■∙хщ тхЁёшш тёх _TOK... т√ъшэєЄ№ шч т√Ёрцхэш , юёЄртшЄ№ +_TOKEXPR, +_TOKTEXT(ёхщўрё эхЄ), <фрээ√х>, +_TOKENDTEXT(ёхщўрё эхЄ, Єюы№ъю _TOKENDEXPR)
  318. }
  319. }
  320.  
  321. PROC fsm()
  322. {
  323. #ifdef TARGET_SCRIPT
  324. VAR double fvalue;
  325. VAR LONG ffraction;
  326. VAR LONG ffractionscale;
  327. VAR LONG fexp;
  328. VAR BOOL fexpminus;
  329. #endif
  330. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  331. VAR UINT i;
  332.   loop:
  333.     _token = readfin();
  334.     switch (_token) {
  335.  
  336. #include "asmj.c" //// ёЄрэфрЁЄэ√х тхЄъш
  337.  
  338. #ifdef TARGET_THUMB
  339. #include "asmj_arm.c" //// ьр°шээючртшёшь√х тхЄъш
  340. #else
  341. #include "asmj_z80.c" //// ьр°шээючртшёшь√х тхЄъш
  342. #endif
  343.  
  344.       default : {err((CHAR)_token); enderr(); goto loop;}
  345.     };
  346.   endloop:;
  347. }
  348.  
  349.