Subversion Repositories NedoOS

Rev

Rev 2325 | 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_SCRIPT
  73. VAR double fvalue;
  74. VAR LONG fexp;
  75. VAR BOOL fexpminus;
  76. VAR LONG ffraction;
  77. VAR LONG ffractionscale;
  78. #endif
  79.  
  80. #ifdef TARGET_THUMB
  81. #include "asmf_arm.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
  82. #else
  83. #include "asmf_z80.c" //// ьр°шээючртшёшь√х яЁюЎхфєЁ√ ш юс· тыхэш 
  84. #endif
  85.  
  86. PROC rdnum_()
  87. {
  88. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  89. VAR UINT scale; //яюърчрЄхы№ ёшёЄхь√ ёўшёыхэш 
  90.         //readfin(); //_TOKTEXT (TODO фю тїюфр)
  91.         //_token = readfin(); //first digit or prefix (0x, 0b, 0)
  92.         tempvalue = 0L;
  93.         scale = 10;
  94.         IF ((CHAR)_token=='0'){
  95.           _token=readfin(); //'x' (hex), 'b' (bin), 'o' (oct), else oct with error
  96.           IF       ((CHAR)_token=='x') {
  97.             scale=16;
  98.             rdbase:
  99.             /**IF (_token!=+_TOKENDTEXT)*/ _token=readfin(); //first digit
  100.           }ELSE IF ((CHAR)_token=='b') {
  101.             scale=2;
  102.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  103.           }ELSE IF ((CHAR)_token=='o') {
  104.             scale=8;
  105.             goto rdbase; //IF (_token!=+_TOKENDTEXT) _token=readfin(); //first digit
  106.           //}ELSE IF ((CHAR)_token=='L') { //0L
  107.           //}ELSE IF ((CHAR)_token=='.') { //0.
  108.           }ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) { //0..9
  109.             scale=8;
  110.             errstr("Use 0o oct"); enderr();
  111.           };
  112.         };
  113.         //IF (_token!=+_TOKENDTEXT) { //TODO 0..9a..f (L юсёыєцшЄ№ тэх Ўшъыр)
  114.           rdnumloop: //WHILE (+TRUE)
  115.           //{ //яхЁтр  ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
  116.             //IF ((_token==+_TOKENDTEXT)||_waseof) goto rdnumend; //BREAK;
  117.             IF (_waseof) goto rdnumend; //BREAK; //эр тё ъшщ ёыєўрщ
  118.             IF ((CHAR)_token!='L')
  119.             {
  120.               IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {_token = _token - 0x30;
  121.               }ELSE IF ((BYTE)(((BYTE)_token|0x20) - (BYTE)'a') < 0x06) {_token = (_token|0x20) - 0x57;
  122. //              IF ((_token>=0x30)&&(_token<0x3a)) {_token = _token - 0x30;
  123. //              }ELSE IF ((_token>=(BYTE)'a')&&(_token<0x7b)) {_token = _token - 0x57;
  124. //              }ELSE IF ((_token>=(BYTE)'A')&&(_token<0x5b)) {_token = _token - 0x37;
  125. #ifdef TARGET_SCRIPT
  126.               }ELSE IF (_token==(BYTE)'.') { //float
  127.             //printf("float %d",_token);
  128.                 fexp = 0L;
  129.                 fexpminus = +FALSE;
  130.                 ffraction = 0L;
  131.                 ffractionscale = 1L;
  132.                 _token = readfin();
  133.                 //IF (_token!=+_TOKENDTEXT) { //TODO 0..9a..f
  134.                 IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {
  135.                   rdfloatloop:
  136.             //printf("float: %d",_token);
  137.                   //{ //яхЁтр  ЎшЇЁр ўшёыр єцх яЁюўшЄрэр
  138.                     //printf("ffraction = %lf\n",(double)ffraction);
  139.                     //IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK; //TODO 0..9
  140.                     IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
  141.                     //IF ((CHAR)_token!='f') { //???
  142.                       IF (_token==(BYTE)'e') { //TODO e12/e-12
  143.                         _token = readfin();
  144.                         //IF (_token==+_TOKENDTEXT) goto rdfloatend; //BREAK; //TODO 0..9, +-
  145.                         IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
  146.                         IF (_token=='-') { //TODO
  147.                           fexpminus = +TRUE;
  148.                           _token = readfin();
  149.                         };
  150.                         //printf("fexp = %u, token = %c\n",(unsigned int)fexp, _token);
  151.                         //IF (_token!=+_TOKENDTEXT) { //TODO 0..9
  152.                           rdexploop:
  153.                           //{ //яхЁтр  ЎшЇЁр ¤ъёяюэхэЄ√ єцх яЁюўшЄрэр
  154.                             //printf("fexp = %u\n",(unsigned int)fexp);
  155.                             //IF ((_token==+_TOKENDTEXT)||_waseof) goto rdfloatend; //BREAK;
  156.                             IF (_waseof) goto rdfloatend; //BREAK; //эр тё ъшщ ёыєўрщ
  157.                             IF ((BYTE)((BYTE)_token - (BYTE)'0') >= 0x0a) goto rdfloatend; //BREAK;
  158.                             fexp = fexp*10L + (LONG)(_token - (BYTE)'0');
  159.                             _token = readfin();
  160.                             goto rdexploop;
  161.                           //}
  162.                         //};
  163.                         goto rdfloatend; //BREAK;
  164.                       }ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') >= 0x0a) {
  165.                         goto rdfloatend; //BREAK;
  166.                       };
  167.                     //}; //!='f'
  168.                     ffraction = ffraction*10L + (LONG)(_token - (BYTE)'0');
  169.                     ffractionscale = ffractionscale*10L;
  170.                     //ffraction += (float)(_token - (BYTE)'0')*ffractionscale;
  171.                     _token = readfin();
  172.                     goto rdfloatloop;
  173.                   //};
  174.                 }; //0..9
  175.                 rdfloatend:
  176.                 fvalue = (double)tempvalue + (double)ffraction/(double)ffractionscale; //чэръ ЁрсюЄрхЄ ъръ юяхЁрЎш , Єръ ўЄю эх єўшЄ√трхь
  177.                 IF (fexpminus) {
  178.                   fvalue = fvalue/pow10(fexp);
  179.                 }ELSE {
  180.                   fvalue = fvalue*pow10(fexp);
  181.                 };
  182.                 //fvalue = 0.1415926536;
  183.                 //printf("%ld\n",fexp);
  184.                 //printf("%20.20lf\n",fvalue);
  185.                 //printf("%20.20lf\n",0.1415926536);
  186.                 tempvalue = *(LONG*)(&fvalue);
  187.                 goto rdnumend;
  188. #endif
  189.               }ELSE { //эх ЎшЇЁр ш эх .
  190.                 goto rdnumend;
  191.               };
  192.               //tempvalue = (LONG)scale*tempvalue + (LONG)(_token - (BYTE)'0');
  193.               tempvalue = (LONG)scale*tempvalue + (LONG)_token;
  194.             }; //IF ((CHAR)_token!='L')
  195.             _token = readfin();
  196.             goto rdnumloop;
  197.           //};
  198.           rdnumend:;
  199.         //};
  200.         //IF ((CHAR)_token=='L') {_token = readfin();}; //Єръ эх ЁрсюЄрхЄ (яюўхьє?)
  201.         asmpushvalue(tempvalue);
  202. }
  203.  
  204. PROC doexpr_ RECURSIVE FORWARD();
  205.  
  206. PROC doval_ RECURSIVE() //ўшЄрхь чэрўхэшх (ўшёыю шыш ьхЄъє, шыш TODO т√Ёрцхэшх т ёъюсърї)
  207. {
  208. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  209. {
  210. //;;printf("doval\n");
  211. dovalloop:
  212.   IF (_token==(BYTE)'-') {
  213. //;;printf("valTOKMINUS\n");
  214.         _token = readfin(); //(фю тїюфр)
  215.         doval_();
  216.         //asmpushvalue(0L-asmpopvalue()); //BUG!!! TODO fix!
  217.         //asmpushvalue(-asmpopvalue()); //BUG!!! TODO fix!
  218.         tempvalue=asmpopvalue(); asmpushvalue(0L-tempvalue);
  219.         //asmpushvalue(0L); tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
  220.   }ELSE IF (_token==(BYTE)'+') {
  221. //;;printf("valTOKPLUS\n");
  222.         _token = readfin(); //(фю тїюфр)
  223.         goto dovalloop;
  224.   }ELSE IF (_token==(BYTE)'$') {
  225. //;;printf("valTOKDOLLAR\n");
  226.         asmpushvalue((LONG)(_curaddr+_curshift)); _isaddr = +_ASMLABEL_ISADDR;
  227.         _token = readfin(); //(фю тїюфр)
  228.   }ELSE IF (_token==+_TOKPRIME) {
  229. //;;printf("valTOKPRIME\n");
  230.         asmreadprefixed(); //ўшЄрхь ўхЁхч readfin, ЁрёъЁ√трхь \n \r \t \0
  231.         asmpushvalue((LONG)_prefixedtoken);
  232.         readfin(); //чръЁ√тр■∙шщ ряюёЄЁюЇ
  233.         _token = readfin(); //(фю тїюфр)
  234.   }ELSE IF (_token==+_TOKOPEN) {
  235. //;;printf("valTOKOPEN\n");
  236.         _token = readfin(); //(фю тїюфр)
  237.         doexpr_();
  238.         _token = readfin(); //(яюёых ёъюсъш)
  239.   }ELSE IF (_token==(BYTE)'~') {
  240. //;;printf("valTOKTILDE\n");
  241.         _token = readfin(); //(фю тїюфр)
  242.         doval_();
  243.         asmpushvalue(~asmpopvalue());
  244.   }ELSE IF (_token==(BYTE)'!') {
  245. //;;printf("valTOKEXCL\n");
  246. //TODO _TOKSTAR (PEEK)
  247.         _token = readfin(); //(фю тїюфр)
  248.         doval_();
  249.         asmpushvalue(!asmpopvalue());
  250. /**  }ELSE IF (_token==+_TOKNUM) { //TODO єсЁрЄ№
  251.         _token = readfin(); //(фю тїюфр)
  252.         goto dovalloop;
  253.   }ELSE IF (_token==+_TOKTEXT) { //TODO єсЁрЄ№
  254.         _token = readfin(); //(фю тїюфр)
  255.         goto dovalloop;*/
  256.   }ELSE IF ((BYTE)((BYTE)_token - (BYTE)'0') < 0x0a) {
  257. //;;printf("valTOKNUM\n");
  258.         //readfin(); //_TOKTEXT (фю тїюфр)
  259.         rdnum_();
  260.         //goto doexprlooptok;
  261.   }ELSE IF (_token==+_TOKDIRECT) { //for ARM
  262.         _token = readfin(); //(фю тїюфр)
  263.         goto dovalloop;
  264.   }ELSE /**IF (_token==+_TOKLABEL)*/ {
  265. //;;printf("valTOKLABEL\n");
  266.         readlabel();
  267.         _plabel_index = findlabel(_curlabeltext);
  268.         asmpushvalue(getlabel());
  269.   }/**ELSE {
  270. ;;printf("?valTOK %d\n",(UINT)_token);
  271. ;;printf("addr=%d\n",_curaddr);
  272.         _token = readfin(); //(фю тїюфр)
  273.         goto dovalloop;
  274.   }*/;
  275. //;;printf("dovalq\n");
  276. }
  277. }
  278.  
  279. PROC doexpr_ RECURSIVE()
  280. {
  281. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  282. {
  283. //ўшЄрхь фю _TOKENDEXPR
  284. //т яхЁтющ тхЁёшш ёўшЄрхь ёыхтр эряЁртю
  285. //TODO switch? шыш яЁш эхёъюы№ъшї єЁютэ ї тыюцхээюёЄш юёЄрэхЄё  т ърцфюь ьрыю
  286.  
  287. //яЁюсхы√ шуэюЁшЁєхь (TODO юЄъєфр юэш т ъюэЎх т√Ёрцхэш  яхЁхф ъюььхэЄрЁшхь?): +_TOKSPC0 ... +_TOKSPC0+_ASMMAXSPC-1
  288. //ўшёыю: <фрээ√х>
  289. //ьхЄър: <фрээ√х>
  290. //чрърт√ўхээ√щ срщЄ: +_TOKPRIME, <фрээ√х>, +_TOKPRIME
  291. //$: +_TOKDOLLAR
  292. //+: _TOKPLUS
  293. //-: _TOKMINUS
  294. //*: +_TOKSTAR
  295. //;;printf("doexpr addr=%d\n",_curaddr);
  296.   doval_(); //яхЁт√щ ярЁрьхЄЁ
  297. doexprloop:
  298. //;;printf("exprTOK %d\n",(UINT)_token);
  299.   IF ((_token==+_TOKENDEXPR/**TODO _TOKENDTEXT*/)||(_token==+_TOKCLOSE)||_waseof) goto doexprq; //BREAK;
  300.   IF (_token==(BYTE)'+') {
  301. //;;printf("TOKPLUS\n");
  302.         _token = readfin(); //(фю тїюфр)
  303.         doval_();
  304.         asmpushvalue(asmpopvalue()+asmpopvalue());
  305.   }ELSE IF (_token==(BYTE)'-') {
  306. //;;printf("TOKMINUS\n");
  307.         _token = readfin(); //(фю тїюфр)
  308.         doval_();
  309.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()-tempvalue);
  310.   }ELSE IF (_token==(BYTE)'*') {
  311. //;;printf("TOKSTAR\n");
  312.         _token = readfin(); //(фю тїюфр)
  313.         doval_();
  314.         asmpushvalue(asmpopvalue()*asmpopvalue()); _isaddr = 0x00;
  315.   }ELSE IF (_token==(BYTE)'/') {
  316. //;;printf("TOKSLASH\n");
  317.         _token = readfin(); //(фю тїюфр)
  318.         doval_();
  319.         tempvalue=asmpopvalue();
  320.         {
  321.         ;;IF (tempvalue!=0L)
  322.           asmpushvalue(asmpopvalue()/tempvalue);
  323.         }
  324.   }ELSE IF (_token==(BYTE)'>') {
  325. //;;printf("TOKMORE\n");
  326.         readfin(); //+_TOKMORE (2-щ)
  327. //TODO >, >=
  328.         _token = readfin(); //(фю тїюфр)
  329.         doval_();
  330.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()>>tempvalue);
  331.   }ELSE IF (_token==(BYTE)'<') {
  332. //;;printf("TOKLESS\n");
  333. //TODO <, <=
  334. //TODO _TOKEQUAL, _TOKEXPL (!=)
  335.         readfin(); //+_TOKLESS (2-щ)
  336.         _token = readfin(); //(фю тїюфр)
  337.         doval_();
  338.         tempvalue=asmpopvalue(); asmpushvalue(asmpopvalue()<<tempvalue);
  339.   }ELSE IF (_token==(BYTE)'&') {
  340. //;;printf("TOKAND\n");
  341. //TODO Єръцх фтющэ√х
  342.         _token = readfin(); //(фю тїюфр)
  343.         doval_();
  344.         asmpushvalue(asmpopvalue()&asmpopvalue());
  345.   }ELSE IF (_token==(BYTE)'|') {
  346. //;;printf("TOKPIPE\n");
  347. //TODO Єръцх фтющэ√х
  348.         _token = readfin(); //(фю тїюфр)
  349.         doval_();
  350.         asmpushvalue(asmpopvalue()|asmpopvalue());
  351.   }ELSE IF (_token==(BYTE)'^') {
  352. //;;printf("TOKCARON\n");
  353. //TODO Єръцх фтющэ√х
  354.         _token = readfin(); //(фю тїюфр)
  355.         doval_();
  356.         asmpushvalue(asmpopvalue()^asmpopvalue());
  357.   }ELSE IF ((_token-+_TOKSPC1) < 0x08) {
  358. //;;printf("TOKSPC1\n",_curaddr);
  359.         _token = readfin(); //(фю тїюфр)
  360.   }ELSE {
  361. //TODO ==, !=
  362. ;;printf("?TOK %d\n",(UINT)_token);
  363. ;;printf("addr=%d\n",_curaddr);
  364.         _token = readfin(); //(фю тїюфр)
  365.   };
  366.   goto doexprloop;
  367. doexprq:
  368. //;;printf("doexprq\n");
  369. }
  370. }
  371.  
  372. PROC fsm()
  373. {
  374. VAR LONG tempvalue; //чэрўхэшх, ёўшЄрээюх яю popvalue ш ъюЄюЁюх яш°хь яю pushvalue
  375. VAR UINT i;
  376.   loop:
  377.     _token = readfin();
  378.   looptok:
  379.     switch (_token) {
  380.  
  381. #include "asmj.c" //// ёЄрэфрЁЄэ√х тхЄъш
  382.  
  383. #ifdef TARGET_THUMB
  384. #include "asmj_arm.c" //// ьр°шээючртшёшь√х тхЄъш
  385. #else
  386. #include "asmj_z80.c" //// ьр°шээючртшёшь√х тхЄъш
  387. #endif
  388.  
  389.       default : {err((CHAR)_token); enderr(); goto loop;}
  390.     };
  391.   endloop:;
  392. }
  393.  
  394.