Subversion Repositories Kolibri OS

Rev

Rev 6446 | Rev 7545 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define _TOKC_
  2.  
  3. #include <fcntl.h>       /* O_ constant definitions */
  4. #include <unistd.h>      
  5. #include "tok.h"
  6.  
  7. void GetFileTime(int fd,struct ftime *buf);
  8.  
  9. #define MAXIF 32
  10.  
  11. //idrec *crec=NULL;
  12.  
  13. char invaliddecrem[]="invalid token to be decremented";
  14. char mesLOOPNZ[]="LOOPNZ";
  15. char mesIF[]="IF";
  16. char mesELSE[]="ELSE";
  17. char mesWHILE[]="WHILE";
  18. char mesFOR[]="FOR";
  19. char mesRETURN[]="RETURN";
  20. int tok,tok2; /* token holders current, next */
  21. unsigned char string[STRLEN],string2[STRLEN+20],
  22.   string3[STRLEN];      //ёюфхЁцшЄ эх яЁхюсЁрчютрээє■ ёЄЁюъє
  23. unsigned int posts=0;            /* number of post entrys */
  24. postinfo *postbuf;
  25. unsigned int maxposts=MAXPOSTS;
  26. unsigned int secondcallnum=1;  /* # of different second calls and labels */
  27. unsigned int externnum=0;
  28. unsigned long postsize=0;                        /* total size of all post vars */
  29. unsigned int poststrptr=0;      /* post string index in output */
  30. unsigned int outptrsize=MAXDATA;        //ЁрчьхЁ т√їюфэюую сєЇхЁр фы  ъюфр
  31. unsigned int outdatasize=MAXDATA;       //ЁрчьхЁ т√їюфэюую сєЇхЁр фы  фрээ√ї
  32. long runfilesize;
  33. int error=0;             /* current error number holder */
  34. unsigned char dos1=0,dos2=0;            /* DOS version required for program execution */
  35. unsigned char cpu=0;    /* CPU required, 2 for 80286, 3 for 80386, ... */
  36. unsigned int paramsize=0;  /* byte size of all procedure parameters */
  37. unsigned int localsize=0;  /* byte size of all procedure local variables */
  38. unsigned int procedure_start=0; /* address of start of procedure */
  39. unsigned int current_proc_type;  /* current procedure type */
  40. int returntype;                                  /* return type, (void, byte, word, ...) */
  41. unsigned char warning;
  42. /*+++++++++++++++++++++++ ╙ёЄрэютъш яю єьюыўрэш■ +++++++++++++++++++++++*/
  43. unsigned char am32 = FALSE;                   // Ёхцшь 32 сшЄэющ рфЁхёрЎшш
  44. unsigned char comfile = file_com;               // output file format
  45. unsigned char optimizespeed = 1;                        // optimize for size or speed flag
  46. unsigned char alignword = 1;                                    // flag whether or not to align words
  47. unsigned char aligner = 0;                                              // value used to align words
  48. unsigned char header = 1;                                               // output SPHINX C-- Ver1 Ver2 header
  49. unsigned char chip = 0;                                                         // CPU optimization (286,386,486,...)
  50. unsigned char killctrlc = 0;                                    // add disable CTRL-C code in header
  51. unsigned int    stacksize = 2048;                       // stack size (2048 default)
  52. unsigned char splitdata=FALSE;        //юЄфхышЄ№ фрээ√х юЄ ъюфр
  53. unsigned char AlignCycle=FALSE;       //т√ЁртэштрЄ№ эрўрыр Ўшъыют
  54. /*+++++++++++++++++++ end of flexable compiler options ++++++++++++++++++++*/
  55. unsigned char notdoneprestuff = TRUE; // flag if initial stuff has been entered
  56. unsigned int datasize=0,alignersize=0;  /* size of data and other */
  57. unsigned int outptr=0x100,outptrdata=0x100;                     /* ptr to output */
  58. unsigned char *output;
  59. unsigned char *outputdata=NULL;
  60. unsigned int linenumber=0;
  61. unsigned char dynamic_flag=0;   //Їыру юсЁрсюЄъш фшэрьшўхёъшї ¤ыхьхэЄют
  62.  
  63. unsigned char *input;    /* dynamic input buffer */
  64. unsigned int endinptr;           /* end index of input array */
  65. unsigned int inptr;              /* index in input buffer */
  66. unsigned char cha;               /* pipe byte for token production */
  67. char endoffile;                  /* end of input file flag */
  68. unsigned char insertmode=FALSE;
  69. unsigned int numblocks=0;       //эюьхЁ тыюцхээюую сыюър
  70. treelocalrec *tlr=NULL; //Ўхяюўър ыюъры№э√ї сыюъют
  71. treelocalrec *btlr=NULL;        //Ўхяюўър шёяюы№чютрэ√ї ыюъры№э√ї сыюъют
  72. RETLIST *listreturn=NULL;
  73. unsigned int numreturn=0;
  74. idrec *staticlist;
  75. unsigned char stat_reg[8];      //ЄрсышЎр чрэ ЄюёЄш ЁхушёЄЁют
  76.  
  77. int sizestack=0;        //ЁрчьхЁ эх ъюьяхэёшЁютрээ√ї ярЁрьхЄЁют ЇєэъЎшщ
  78. unsigned char addstack=TRUE;
  79.  
  80. extern char shorterr[];
  81. extern unsigned long long li[];
  82.  
  83. /*-----------------01.05.98 19:22-------------------
  84.  фюяюыэшЄхы№э√х яхЁхьхээ√х фы  ЁхрышчрЎшш BREAK CONTINUE
  85. --------------------------------------------------*/
  86. #define MAXIN 100       //ьръёшьры№эр  тыюцхэюёЄ№ Ўшъыют
  87. unsigned int numbr=0;   //ёўхЄўшъ юс∙хую ўшёыр Ўшъыют LOOP DO-WHILE...
  88. unsigned int listbr[MAXIN];     //ЄрсышЎр эюьхЁют Ўшъыют
  89. unsigned int usebr[MAXIN];      //шёяюы№чютрэю break
  90. unsigned int useco[MAXIN];      //шёяюы№чютрэю continue
  91. unsigned int curbr=0,curco=0;   //Єхъє∙р тыюцхэюёЄ№ Ўшъыют
  92. unsigned int startStartup=0x100;
  93. unsigned int endStartup=0;
  94. unsigned char useStartup=FALSE;
  95. unsigned char notpost=FALSE;
  96. int retproc;
  97. int lastcommand;        //яюёыхфэшщ юяхЁрЄюЁ т сыюъх
  98. unsigned char FastCallApi=TRUE; //ЁрчЁх°шЄ№ с√ёЄЁ√щ т√чют API яЁюЎхфєЁ
  99. unsigned char FixUp=FALSE;      //─хырЄ№ ыш ЄрсышЎє яхЁхьх∙хэшщ
  100. unsigned char AlignProc=FALSE;
  101. //------- ЁрсюЄр ё union ---------------------------------------------
  102. char param[256];        //сєЇхЁ фы  ярЁрьхЄЁют яЁюЎхфєЁ√
  103. char *BackTextBlock;    //сєЇхЁ фы  яхЁхэхёхээюую ЄхъёЄр
  104. int SizeBackBuf=0,MaxSizeBackBuf;
  105. struct FILEINFO *startfileinfo=NULL;
  106. unsigned int totalmodule=0;
  107. unsigned int currentfileinfo;
  108. unsigned char setzeroflag;      //юяхЁрЎш  ьхэ хЄ zero flag
  109. unsigned char notunreach=FALSE;
  110. unsigned int initBP=0;
  111. int inlineflag=0;  // flag for disabling entry and exit codes production
  112. unsigned char fstatic=FALSE;
  113.  
  114. unsigned long addESP=0; //фюсртър ёЄхър
  115. unsigned char blockproc=FALSE;  //шфхЄЁрчсюЁър сыюър ЇєэъЎшш
  116.  
  117. unsigned int   updatelocalvar(char *str,int tok,unsigned int num);
  118. void setuprm();
  119. void doloop(unsigned int typeb);                                                         /* both short and long loops */
  120. void doBREAK(unsigned char typeb);
  121. void doCONTINUE(unsigned char typeb);
  122. void dowhile(unsigned int typeb);
  123. void MakeContinue(unsigned char typeb);
  124. void dofor(unsigned int typeb);
  125. void dodo();
  126. void globalvar();       /* both initialized and unitialized combined */
  127. void doswitch();
  128. void CalcRegPar(int reg,int def,char *&ofsstr);
  129. void JXorJMP();
  130. int loadinputfile(char *inpfile);
  131. int SaveStartUp(int size,char *var_name);
  132. void LoadData(unsigned int size,int filehandle);
  133. void SetNewTok(int type,int typev);
  134. void doreturn(int type=tokens);         /* do return(...); */
  135. void notnegit(int notneg);
  136. void insertcode();               // force code procedure at specified location
  137. void interruptproc();
  138. void dobigif();
  139. void doif(void);
  140. void doasmblock();
  141. void declareextern();
  142. unsigned long dounion(int,int);
  143. void RunBackText();
  144. int FindDublString(int segm,unsigned int len,int term);
  145. void *liststring=NULL;  //Ўхяюўър шэЇюЁьрЎшюээ√ї сыюъют ю ёЄЁюърї
  146. void GetNameLabel(int type,int num);
  147. void CheckPosts();
  148. SAVEPAR *SRparam(int save,SAVEPAR *par);        //save or restore global param compiler
  149. void AddRetList(int pos,int line,int type);
  150. void CheckRealizable();
  151. void declare_procedure(int oflag,int orm,int npointr);
  152. void labelindata();
  153. void AddRegistr(int razr,int reg);
  154. void ClearRegister();
  155. int GetRegister(int mode=0);
  156. void RegAddNum(int reg);
  157. void dowhilefast(unsigned int typeb);
  158. int getrazr(int type);
  159. void RestoreSaveReg();
  160. void killlocals(/*int endp=TRUE*/);
  161. void leaveproc();
  162. int IsSaveReg();
  163. void CorrectParamVar();
  164.  
  165. extern void ManyLogicCompare();
  166. extern void maxdataerror();
  167. extern void CompareOr();
  168. extern void dynamiclabelerror();
  169. extern void retvoid();
  170. extern int numberbreak;
  171.  
  172. SAVEREG savereg;
  173. SAVEREG *psavereg=&savereg;
  174.  
  175. int loadfile(char *filename,int firstflag)
  176. {
  177. int hold;
  178.  
  179.         for(int i=0;i<=numfindpath;i++){
  180.                 sprintf((char *)string2,"%s%s",findpath[(firstflag==0?i:numfindpath-i)],filename);
  181.                 if((hold=loadinputfile((char *)string2))!=-2)break;
  182.                 if(firstflag==2||(firstflag==0&&(i+1)==numfindpath))break;
  183.         }
  184.         if(hold==-2){
  185.                 unableopenfile(filename); //ёююс∙хэшх ю ю°шсъх
  186.                 exit(e_cannotopeninput);        //чртхЁ°шЄ№ ЁрсюЄє хёыш эх ёьюуыш чруЁєчшЄ№ Їрщы
  187.         }
  188.         return hold;
  189. }
  190.  
  191. void compilefile(char *filename,int firstflag)
  192. {
  193. int hold;
  194.  
  195.         hold=loadfile(filename,firstflag);
  196.         if(hold==1||hold==-1)return;
  197.         if(strcmp(filename,"startup.h--")==0)startupfile=currentfileinfo;
  198.  
  199.         inptr=0;
  200.         endoffile=0;
  201.         startline=(char*)input;
  202.         endinput=startline+endinptr;
  203.         warning=gwarning;
  204.         nextchar();
  205.         cha2=cha; //ёшьтюы шч сєЇхЁр
  206.         inptr2=inptr;   //чряюьэ єърчрЄхы№ эр ёыхф ёшьтюы
  207.         linenum2=1;   //эюьхЁ ёЄЁюъш
  208.         {       //яЁютхЁър эр Їрщы ЁхёєЁёют ш хую юсЁрсюЄър
  209.                 char *a;
  210.                 if((a=strrchr(filename,'.'))!=NULL){
  211.                         if(stricmp(a,".rc")==0){
  212.                                 input_res();
  213.                                 free(input);
  214.                                 return;
  215.                         }
  216.                 }
  217.         }
  218.  
  219.         nexttok();    //юяЁ Єшя яхЁтюую ш тЄюЁюую Єюъхэр
  220.         while(tok!=tk_eof){     //Ўшъы яюър эх ъюэўшЄё  Їрщы
  221.                 while(tok==tk_question){
  222.                         directive();//юсЁрсюЄър фшЁхъЄшт
  223.                         if(tok==tk_semicolon)nexttok();
  224.                 }
  225.                 usedirectiv=FALSE;
  226.                 if(notdoneprestuff==TRUE)doprestuff();//startup
  227.                 switch(tok){
  228.                         case tk_ID:
  229.                         case tk_id:
  230.                                 if(FindTeg(TRUE)!=NULL){
  231.                                         InitStruct();
  232.                                         break;
  233.                                 }
  234.                                 if(tok2==tk_colon){
  235.                                         labelindata();
  236.                                         break;
  237.                                 }
  238.                         case tk_far:
  239.                         case tk_cdecl:
  240.                         case tk_pascal:
  241.                         case tk_stdcall:
  242.                         case tk_fastcall:
  243.                         case tk_declare:
  244.                         case tk_undefproc:
  245.                         case tk_float:
  246.                         case tk_long:
  247.                         case tk_dword:
  248.                         case tk_word:
  249.                         case tk_byte:
  250.                         case tk_char:
  251.                         case tk_int:
  252.                         case tk_void:
  253.                         case tk_export:
  254.                         case tk_qword:
  255.                         case tk_double:
  256.                         case tk_fpust:
  257.                                 if((hold=testInitVar())==FALSE)define_procedure();
  258.                                 else if(hold==TRUE)globalvar();
  259.                                 break;
  260.                         case tk_struct: InitStruct(); break;
  261.                         case tk_interrupt: interruptproc(); break;
  262.                         case tk_at: insertcode(); break;        //тёЄртър ЁхушёЄЁютющ яЁюЎхфєЁ√
  263.                         case tk_colon:
  264.                                 nexttok();
  265.                                 dynamic_flag=2;
  266.                                 break;// юяЁ фшэрьшўхёъющ  яЁюЎхфєЁ√
  267.                         case tk_inline:
  268.                                 if(testInitVar()){
  269.                                         preerror("Bad header dynamic function");
  270.                                         nexttok();
  271.                                 }
  272.                                 dynamic_proc();
  273.                                 break;
  274.                         case tk_static:
  275.                                 fstatic=2;
  276.                                 nexttok();
  277.                                 break;
  278.                         case tk_enum: doenum(); break;
  279.                         case tk_from: nexttok(); dofrom(); nextseminext(); break;
  280.                         case tk_extract: nexttok(); doextract(); seminext(); break;
  281.                         case tk_loop:
  282.                         case tk_while:
  283.                         case tk_do:
  284.                         case tk_else:
  285.                         case tk_ELSE:
  286.                         case tk_if:
  287.                         case tk_IF:
  288.                         case tk_interruptproc:
  289.                         case tk_proc:
  290.                         case tk_charvar:
  291.                         case tk_intvar:
  292.                         case tk_bytevar:
  293.                         case tk_longvar:
  294.                         case tk_dwordvar:
  295.                         case tk_floatvar:
  296.                         case tk_qwordvar:
  297.                         case tk_doublevar:
  298.                         case tk_wordvar: idalreadydefined(); break;
  299.                         case tk_reg32:
  300.                         case tk_debugreg:
  301.                         case tk_controlreg:
  302.                         case tk_testreg:
  303.                         case tk_reg:
  304.                         case tk_seg:
  305.                         case tk_beg:
  306.                         case tk_reg64:
  307.                                 preerror("register name cannot be used as an identifier");
  308.                                 nexttok();
  309.                         case tk_eof: break;
  310.                         case tk_locallabel: internalerror("local label token found outside function block."); break;
  311.                         case tk_extern: declareextern(); break;
  312.                         case tk_union: dynamic_flag=0; dounion(TRUE,fstatic==0?0:f_static); break;
  313.                         case tk_semicolon: nexttok(); break;
  314.                         case tk_asm:
  315.                                 if(tok2==tk_openbrace)doasmblock();
  316.                                 else doasm();
  317.                                 break;
  318.                         case tk_idasm: doasm(TRUE); break;
  319.                         case tk_dollar: doasm(FALSE); break;
  320.                         default: unuseableinput();
  321. /*                              while(itok.type==tp_stopper&&tok!=tk_eof)*/nexttok();
  322.                                 break;
  323.                 }
  324.                 if(fstatic)fstatic--;
  325.                 else if(dynamic_flag)dynamic_flag--;
  326.         }
  327.         (startfileinfo+currentfileinfo)->stlist=staticlist;
  328.         free(input);
  329. }
  330.  
  331. /* ------------------- output procedures start ------------------- */
  332. int CheckCodeSize()
  333. //яЁютхЁър ЁрчьхЁр сєЇхЁр фы  ъюфр
  334. {
  335.         if(!am32){
  336.                 maxoutputerror();
  337.                 return FALSE;
  338.         }
  339.         outptrsize+=MAXDATA;
  340.         output=(unsigned char *)REALLOC(output,outptrsize);
  341.         if(splitdata==FALSE)outputdata=output;
  342.         return TRUE;
  343. }
  344.  
  345. int CheckDataSize()
  346. //яЁютхЁър ЁрчьхЁр сєЇхЁр фы  ъюфр
  347. {
  348.         if(!am32){
  349.                 maxoutputerror();
  350.                 return FALSE;
  351.         }
  352.         outdatasize+=MAXDATA;
  353.         outputdata=(unsigned char *)REALLOC(outputdata,outdatasize);
  354.         return TRUE;
  355. }
  356.  
  357. void  op(int byte)
  358. {
  359.         if(outptr>=outptrsize&&CheckCodeSize()==FALSE)return;
  360.         output[outptr++]=(unsigned char)byte;
  361.         if(splitdata==FALSE)outptrdata=outptr;
  362.         retproc=FALSE;
  363. }
  364.  
  365. void  opd(int byte)
  366. {
  367.         if(splitdata==FALSE){
  368.                 if(outptr>=outptrsize&&CheckCodeSize()==FALSE)return;
  369.                 output[outptr++]=(unsigned char)byte;
  370.                 outptrdata=outptr;
  371.         }
  372.         else{
  373.                 if(outptrdata>=outdatasize&&CheckDataSize()==FALSE)return;
  374.                 outputdata[outptrdata++]=(unsigned char)byte;
  375.         }
  376. }
  377.  
  378. void CorrectOfsBit(int bitofs)
  379. {
  380.         bitofs=(bitofs+7)/8;
  381.         if(splitdata)outptrdata+=bitofs;
  382.         else{
  383.                 outptr+=bitofs;
  384.                 outptrdata=outptr;
  385.         }
  386. }
  387.  
  388. long GetBitMask(int ofs,int size)
  389. {
  390.         return (~((li[size]-1)<<ofs));
  391. }
  392.  
  393. void opb(unsigned long num,unsigned int ofs,unsigned int size)
  394. {
  395. int s;
  396. //яЁютхЁшЄ№ т√їюф чр уЁрэшЎ√ сыюър ярь Єш
  397.         s=(ofs+size+7)/8;
  398.         if(splitdata==FALSE){
  399.                 if((outptr+s+8)>=outptrsize&&CheckCodeSize()==FALSE)return;
  400.         }
  401.         else{
  402.                 if((outptrdata+s+8)>=outdatasize&&CheckDataSize()==FALSE)return;
  403.         }
  404.         if(size!=32)num=num&(li[size]-1);
  405.         s=outptrdata+ofs/8;
  406.         ofs=ofs%8;
  407.         *(long *)&outputdata[s]&=GetBitMask(ofs,size);
  408.         *(long *)&outputdata[s]|=(num<<ofs);
  409. //      printf("ofs=%Xh mask=%X value=%X\n",s,GetBitMask(ofs,size),(num<<ofs));
  410.         if((ofs+size)>32){
  411.                 *(long *)&outputdata[s+4]&=GetBitMask(0,ofs+size-32);
  412.                 *(long *)&outputdata[s+4]|=(num>>(64-ofs-size));
  413. //              printf("continue ofs=%Xh mask=%X value=%X\n",s+4,GetBitMask(0,ofs+size-32),num>>(64-ofs-size));
  414.         }
  415. }
  416.  
  417. void  outword(unsigned int num)
  418. {
  419.         op(num);
  420.         op(num/256);
  421. }
  422.  
  423. void  outwordd(unsigned int num)
  424. {
  425.         opd(num);
  426.         opd(num/256);
  427. }
  428.  
  429. void  outdword(unsigned long num)
  430. {
  431.         outword((unsigned int)(num&0xFFFFL));
  432.         outword((unsigned int)(num/0x10000L));
  433. }
  434.  
  435. void  outdwordd(unsigned long num)
  436. {
  437.         outwordd((unsigned int)(num&0xFFFFL));
  438.         outwordd((unsigned int)(num/0x10000L));
  439. }
  440.  
  441. void  outqword(unsigned long long num)
  442. {
  443.         outdword((unsigned long)(num&0xFFFFFFFFL));
  444.         outdword((unsigned long)(num/0x100000000LL));
  445. }
  446.  
  447. void  outqwordd(unsigned long long num)
  448. {
  449.         outdwordd((unsigned long)(num&0xFFFFFFFFL));
  450.         outdwordd((unsigned long)(num/0x100000000LL));
  451. }
  452.  
  453. void  doasmblock()
  454. {
  455.         nexttok();
  456.         useasm=TRUE;
  457.         expecting(tk_openbrace);
  458.         for(;;){
  459.                 if(tok==tk_closebrace)break;
  460.                 if(tok==tk_eof){
  461.                         unexpectedeof();
  462.                         break;
  463.                 }
  464.                 lastcommand=tok;
  465.                 if(dbg)AddLine();
  466.                 doasm(TRUE);
  467.         }
  468.         useasm=FALSE;
  469.         nexttok();
  470. }
  471.  
  472. void doblock()
  473. {
  474.         expecting(tk_openbrace);
  475.         doblock2();
  476. /*      for(;;){
  477.                 if(tok==tk_closebrace)break;
  478.                 if(tok==tk_eof){
  479.                         unexpectedeof();
  480.                         break;
  481.                 }
  482.                 docommand();
  483.         }
  484.         RestoreStack();*/
  485. }
  486.  
  487. void doblock2()
  488. {
  489.         for(;;){
  490.                 if(tok==tk_closebrace)break;
  491.                 if(tok==tk_eof){
  492.                         unexpectedeof();
  493.                         break;
  494.                 }
  495.                 docommand();
  496.         }
  497.         if(numblocks==1&&addstack&&sizestack&&localsize&&am32&&ESPloc&&IsSaveReg()==FALSE){
  498.                 localsize+=sizestack;
  499.                 sizestack=0;
  500.         }
  501.         else RestoreStack();
  502. }
  503.  
  504. void gotodo()
  505. {
  506.         nexttok();
  507.         if(gotol(0))nexttok();
  508.         seminext();
  509. }
  510.  
  511. void GOTOdo()
  512. {
  513.         nexttok();
  514.         if(GOTO())nexttok();
  515.         seminext();
  516. }
  517.  
  518. void docommand()                 /* do a single command */
  519. {
  520. unsigned int useflag;
  521.         useflag=0;
  522.         if(dbg)AddLine();
  523. //loops:
  524.         lastcommand=tok;
  525. //      printf("tok=%d %s\n",tok,itok.name);
  526.         switch(tok){
  527.                 case tk_ID: useflag++;
  528.                 case tk_id:
  529.                         if((useflag=doid((char)useflag,tk_void))!=tokens){
  530.                                 nextseminext();
  531.                                 if(useflag==tk_fpust)preerror("function returned parametr in FPU stack");
  532.                         }
  533.                         else if(tok!=tk_closebrace)docommand();
  534.                         break;
  535.                 case tk_apiproc:
  536.                 case tk_undefproc:
  537.                 case tk_declare:
  538.                         if(doanyundefproc()!=tokens)nextseminext();
  539.                         else if(tok!=tk_closebrace)docommand();
  540.                         break;
  541.                 case tk_proc:
  542.                         doanyproc();
  543.                         nextseminext();
  544.                         break;
  545.                 case tk_interruptproc:
  546.                         outword(0x0E9C);        //pushf //push cs
  547.                         useflag=itok.post;
  548.                         callloc(itok.number);
  549.                         nexttok();
  550.                         expecting(tk_openbracket);
  551.                         expecting(tk_closebracket);
  552. #ifdef OPTVARCONST
  553.                         FreeGlobalConst();
  554. #endif
  555.                         seminext();
  556.                         clearregstat(useflag);
  557.                         break;
  558.                 case tk_bits:
  559.                         dobits();
  560.                         break;
  561.                 case tk_charvar: useflag=1;
  562.                 case tk_bytevar:
  563.                         dobytevar(useflag);
  564.                         break;
  565.                 case tk_intvar: useflag=1;
  566.                 case tk_wordvar:
  567.                         do_d_wordvar(useflag,r16);
  568.                         break;
  569.                 case tk_longvar: useflag=1;
  570.                 case tk_dwordvar:
  571.                         do_d_wordvar(useflag,r32);
  572.                         break;
  573.                 case tk_doublevar:
  574.                         useflag=4;
  575.                 case tk_floatvar:
  576.                         dofloatvar(useflag,tk_floatvar,tk_semicolon);
  577.                         break;
  578.                 case tk_qwordvar:
  579.                         doqwordvar();
  580.                         break;
  581.                 case tk_fpust:
  582.                         dofloatstack(itok.number);
  583.                         break;
  584.                 case tk_structvar:
  585.                         dostruct();
  586.                         break;
  587.                 case tk_pointer:
  588.                         dopointer();
  589.                         break;
  590.                 case tk_mult:
  591.                         dovalpointer();
  592.                         break;
  593.                 case tk_RETURN:
  594.                 case tk_return:
  595.                         RestoreStack();
  596. #ifdef OPTVARCONST
  597.                         ClearLVIC();
  598. #endif
  599.                         doreturn(tok);
  600.                         CheckRealizable();
  601.                         break;
  602.                 case tk_at:
  603.                         nexttok();
  604.                         if(tok2==tk_colon){
  605.                                 LLabel();
  606.                                 if(tok!=tk_closebrace)docommand();
  607.                         }
  608.                         else if(macros(tk_void)!=0)nextseminext();
  609.                         break;
  610.                 case tk_if: RestoreStack(); doif();     break;
  611.                 case tk_IF: RestoreStack(); dobigif(); break;
  612.                 case tk_loopnz:
  613.                 case tk_LOOPNZ:
  614.                 case tk_loop: RestoreStack(); doloop(tok);      break;
  615.                 case tk_while:
  616.                 case tk_WHILE: RestoreStack(); dowhilefast(tok); break;
  617.                 case tk_do: RestoreStack(); dodo();     break;
  618.                 case tk_for:
  619.                 case tk_FOR: RestoreStack(); dofor(tok); break;
  620.                 case tk_reg32: doreg_32((unsigned int)itok.number,r32); break;
  621.                 case tk_reg: doreg_32((unsigned int)itok.number,r16); break;
  622.                 case tk_beg: dobeg((unsigned int)itok.number); break;
  623.                 case tk_reg64: doreg64(itok.number); break;
  624.                 case tk_seg: doseg((unsigned int)itok.number); break;
  625.                 case tk_openbrace:
  626.                         startblock();
  627.                         doblock();
  628.                         nexttok();
  629.                         endblock();
  630.                         break;
  631.                 case tk_from: nexttok(); dofrom(); nextseminext();      break;
  632.                 case tk_extract: nexttok(); doextract(); seminext(); break;
  633.                 case tk_minus: useflag=8;
  634.                 case tk_not:
  635.                         notnegit(useflag);
  636.                         nextseminext();
  637.                         break;
  638.                 case tk_locallabel: RestoreStack(); define_locallabel(); break;
  639.                 case tk_camma:
  640.                 case tk_semicolon: nexttok();   break;
  641.                 case tk_else:
  642.                         preerror("else without preceeding if or IF");
  643.                         nexttok();
  644.                         break;
  645.                 case tk_ELSE:
  646.                         preerror("ELSE without preceeding IF or if");
  647.                         nexttok();
  648.                         break;
  649.                 case tk_eof: unexpectedeof(); break;
  650.                 case tk_void:
  651.                 case tk_long:
  652.                 case tk_dword:
  653.                 case tk_word:
  654.                 case tk_byte:
  655.                 case tk_int:
  656.                 case tk_char:
  657.                         preerror("cannot declare variables within function { } block");
  658.                         nexttok();
  659.                         break;
  660.                 case tk_GOTO:
  661.                         RestoreStack();
  662.                         GOTOdo();
  663.                         CheckRealizable();
  664.                         break;
  665.                 case tk_goto:
  666.                         RestoreStack();
  667.                         gotodo();
  668.                         CheckRealizable();
  669.                         break;
  670.                 case tk_BREAK:
  671.                         RestoreStack();
  672.                         doBREAK(BREAK_SHORT);
  673.                         CheckRealizable();
  674.                         break;
  675.                 case tk_break:
  676.                         RestoreStack();
  677.                         doBREAK((unsigned char)(am32==FALSE?BREAK_NEAR:BREAK_32));
  678.                         CheckRealizable();
  679.                         break;
  680.                 case tk_CONTINUE:
  681.                         RestoreStack();
  682.                         doCONTINUE(CONTINUE_SHORT);
  683.                         CheckRealizable();
  684.                         break;
  685.                 case tk_continue:
  686.                         RestoreStack();
  687.                         doCONTINUE((unsigned char)(am32==FALSE?CONTINUE_NEAR:CONTINUE_32));
  688.                         CheckRealizable();
  689.                         break;
  690.                 case tk_asm:
  691.                         if(tok2==tk_openbrace)doasmblock();
  692.                         else doasm();
  693.                         break;
  694.                 case tk_idasm:
  695.                         useflag=TRUE;
  696.                 case tk_dollar:
  697.                         doasm(useflag);
  698.                         break;
  699.                 case tk_SWITCH:
  700.                 case tk_switch: RestoreStack(); doswitch(); break;
  701.                 case tk_delete: dodelete(); break;
  702.                 case tk_new: donew(); seminext(); break;
  703.                 case tk_question:
  704. //                      calcnumber=FALSE;
  705.                         while(tok==tk_question)directive();
  706.                         break;
  707. /*              case tk_openbracket:
  708.                         nexttok();
  709.                         nexttok();
  710.                         expectingoperand(tk_closebracket);
  711.                         goto loops;*/
  712.                 default: unuseableinput(); break;
  713.         }
  714.         notunreach=FALSE;
  715. }
  716.  
  717. void doBREAK(unsigned char typeb)
  718. {
  719.         if(curbr==0)preerror("'BREAK' or 'break' use only in loop, do-while..");
  720.         else MakeBreak(typeb);
  721.         nextseminext();
  722. }
  723.  
  724. void doCONTINUE(unsigned char typeb)
  725. {
  726.         if(curco==0)preerror("'CONTINUE' or 'continue' use only in loop, do-while..");
  727.         else MakeContinue(typeb);
  728.         nextseminext();
  729. }
  730.  
  731. void MakeBreak(unsigned char typeb)
  732. {
  733. unsigned int nbr=0;
  734.         if(tok2==tk_number){
  735.                 nexttok();
  736.                 nbr=itok.number;
  737.                 if(nbr>=curbr)preerror("'BREAK' or 'break' on incorrect number skip cycle");
  738.         }
  739.         numberbreak=nbr;
  740.         nbr=curbr-1-nbr;
  741.         if(usebr[nbr]==0){
  742.                 GetNameLabel(tk_break,nbr);
  743.                 addlocalvar((char *)string2,tk_locallabel,secondcallnum,TRUE);
  744.                 usebr[nbr]=secondcallnum;
  745.                 secondcallnum++;
  746.         }
  747.         addacall(usebr[nbr],typeb);
  748.         if(typeb==BREAK_SHORT)outword(0x00EB);  // JMP SHORT
  749.         else jumploc0();
  750. }
  751.  
  752. void MakeContinue(unsigned char typeb)
  753. {
  754. unsigned int nbr=0;
  755.         if(tok2==tk_number){
  756.                 nexttok();
  757.                 nbr=itok.number;
  758.                 if(nbr>=curco)preerror("'CONTINUE' or 'continue' on incorrect number skip cycle");
  759.         }
  760.         nbr=curco-1-nbr;
  761.         if(useco[nbr]==0){
  762.                 GetNameLabel(tk_continue,nbr);
  763. //              printf("%s nbr=%d\n",(char *)string2,nbr);
  764.                 addlocalvar((char *)string2,tk_locallabel,secondcallnum,TRUE);
  765.                 useco[nbr]=secondcallnum;
  766.                 secondcallnum++;
  767.         }
  768.         addacall(useco[nbr],typeb);
  769.         if(typeb==CONTINUE_SHORT)outword(0x00EB);       // JMP SHORT
  770.         else jumploc0();
  771. }
  772.  
  773. int CheckExitProc()
  774. {
  775.         if(strcmp(itok.name,"EXIT")==0||strcmp(itok.name,"ABORT")==0)return TRUE;
  776.         return FALSE;
  777. }
  778.  
  779. void LLabel()
  780. {
  781. localrec *ptr;
  782. #ifdef OPTVARCONST
  783.         ClearLVIC();
  784. #endif
  785.         RestoreStack();
  786.         clearregstat();
  787.         switch(tok){
  788.                 case tk_id:
  789.                 case tk_ID:
  790.                         FindOff((unsigned char *)itok.name,CS);
  791.                         ptr=addlocalvar(itok.name,tk_number,outptr,TRUE);
  792.                         if(FixUp)ptr->rec.flag=f_reloc;
  793.                         break;
  794.                 case tk_undefproc:
  795.                         ptr=addlocalvar(itok.name,tk_number,outptr,TRUE);//фюсртшЄ№ т ыюъры№э√щ ёяшёюъ
  796.                         if(FixUp)ptr->rec.flag=f_reloc;
  797.                         updatecall((unsigned int)itok.number,outptr,procedure_start);//юсЁрсюЄрЄ№ Ёрээшх юсЁр∙хэш 
  798.                         break;
  799.                 default:
  800.                         preerror("error declaretion local label");
  801.                         break;
  802.         }
  803.         nexttok();
  804.         nexttok();
  805. }
  806.  
  807. void AddApiToPost(unsigned int num)
  808. {
  809.         CheckPosts();
  810.         (postbuf+posts)->type=CALL_32I;
  811.         (postbuf+posts)->loc=outptr;
  812.         (postbuf+posts)->num=num;
  813.         posts++;
  814.         outdword(0);
  815. }
  816.  
  817. /* ---------------------- Procedure Calling Starts -------------------- */
  818.  
  819. int doanyundefproc(int jumpsend)
  820. {
  821. unsigned int cnum,snum;
  822. int returnvalue;
  823. int regs;
  824. char fname[IDLENGTH];
  825.         if(tok2==tk_colon){     // if a label
  826. #ifdef OPTVARCONST
  827.                 ClearLVIC();
  828. #endif
  829.                 RestoreStack();
  830.                 clearregstat();
  831.                 if(CidOrID()==tk_ID){//local label that has been used, but not placed
  832.                         localrec *ptr=addlocalvar(itok.name,tk_number,outptr,TRUE);
  833.                         if(FixUp)ptr->rec.flag=f_reloc;
  834.                         updatecall((unsigned int)itok.number,outptr,procedure_start);//юсЁрсюЄрЄ№ Ёрээшх юсЁр∙хэш 
  835.                 }
  836.                 else{   //уыюсры№эр  ьхЄър
  837.                         tok=tk_proc;
  838.                         itok.number=outptr;
  839.                         string[0]=0;
  840.                         updatecall((unsigned int)updatetree(),(unsigned int)itok.number,0);
  841.                 }
  842.                 nexttok();      // move past id
  843.                 nexttok();      // move past :
  844.                 return(tokens);
  845.         }
  846.         if(tok2==tk_openbracket){
  847.                 strcpy(fname,itok.name);
  848.                 if(tok==tk_declare){    //ёьхэшЄ№ ёЄрЄєё яЁюЎхфєЁ√ ё юс· тыхэющ эр эхшчтхёЄэє■
  849.                         tok=tk_undefproc;
  850.                         updatetree();
  851.                         if(itok.flag&f_classproc)AddUndefClassProc();
  852.                 }
  853.                 cnum=(unsigned int)itok.number;
  854.                 regs=itok.post;
  855.                 returnvalue=itok.rm;
  856.                 unsigned int tproc=itok.flag;
  857.                 unsigned char apiproc=FALSE;
  858.                 unsigned int oaddESP=addESP;
  859.                 int sizestack=-1;
  860.                 if(tok==tk_apiproc){
  861.                         apiproc=TRUE;
  862.                         sizestack=itok.size;    //ЁрчьхЁ ёЄхър яюф ярЁрьхЄЁ√
  863.                 }
  864. #ifdef OPTVARCONST
  865.                 if(tproc&f_useidx)ClearLVIC();
  866.                 else FreeGlobalConst();
  867. #endif
  868.                 int exitproc=CheckExitProc();
  869.                 snum=initparamproc();
  870.                 if(sizestack!=-1){
  871.                         if(snum>(unsigned int)sizestack)extraparam(fname);
  872.                         else if(snum<(unsigned int)sizestack)missingpar(fname);
  873.                 }
  874.                 if((tproc&f_typeproc)!=tp_cdecl){
  875.                         snum=0;
  876.                         addESP=oaddESP;
  877.                 }
  878.                 if(FastCallApi==TRUE&&apiproc!=FALSE){
  879.                         if(jumpsend)outword(0x25ff);
  880.                         else outword(0x15FF);
  881.                         AddApiToPost(cnum);
  882.                 }
  883.                 else{
  884.                         addacall(cnum,(unsigned char)((tproc&f_extern)!=0?CALL_EXT:(am32!=FALSE?CALL_32:CALL_NEAR)));
  885.                         if(jumpsend)jumploc0();
  886.                         else callloc0();                /* produce CALL [#] */
  887.                 }
  888.                 clearregstat(regs);
  889.                 if(snum!=0&&jumpsend==FALSE)CorrectStack(snum);
  890.                 retproc=exitproc;
  891.                 return(returnvalue);
  892.         }
  893.         thisundefined(itok.name);
  894.         nexttok();
  895.         return(tk_long);
  896. }
  897.  
  898. void CorrectStack(unsigned int num)
  899. {
  900.         if(addstack){
  901.                 sizestack+=num;
  902. //              printf("%s(%d)> Add %d bytes stacks.\n",startfileinfo==NULL?"":(startfileinfo+currentfileinfo)->filename,linenumber,num);
  903.         }
  904.         else{
  905.                 if(short_ok(num)){
  906.                         outword(0xC483);
  907.                         op(num);
  908.                 }
  909.                 else{
  910.                         outword(0xC481);
  911.                         if(am32==FALSE)outword(num);
  912.                         else outdword(num);
  913.                 }
  914.                 addESP-=num;
  915.         }
  916. }
  917.  
  918. unsigned int initparamproc()
  919. {
  920. unsigned int typep=itok.flag,snum=0;
  921. ITOK ostructadr=structadr;
  922.         strcpy(param,(char *)string);
  923.         nexttok();
  924.         switch(typep&f_typeproc){
  925.                 case tp_cdecl:
  926.                 case tp_stdcall:
  927.                         snum=swapparam();
  928.                         break;
  929.                 case tp_pascal:
  930.                         doparams();
  931.                         break;
  932.                 case tp_fastcall:
  933.                         doregparams();
  934.                         break;
  935.         }
  936. //      if(crec)printf("after doparams num=%08X\n",crec->recnumber);
  937.         if((typep&f_classproc)&&(!(typep&f_static))){
  938.                 if((current_proc_type&f_static)&&structadr.sib==THIS_PARAM                            )return snum;
  939.                 structadr=ostructadr;
  940.                 if(structadr.sib==THIS_PARAM){
  941.                         if(structadr.number==0){
  942.                                 op(0xff);
  943.                                 if(ESPloc&&am32){
  944.                                         int num;
  945.                                         num=localsize+addESP+4;
  946.                                         if(short_ok(num,TRUE)){
  947.                                                 outword(0x2474);
  948.                                                 op(num);
  949.                                         }
  950.                                         else{
  951.                                                 outword(0x24B4);
  952.                                                 outdword(num);
  953.                                         }
  954.                                 }
  955.                                 else outword(am32==FALSE?0x0476:0x0875);//push[ebp+4]
  956.                         }
  957.                         else{
  958.                                 int reg=GetRegister(1);
  959.                                 op(0x8B);
  960.                                 if(ESPloc&&am32){
  961.                                         int num;
  962.                                         num=localsize+addESP+4;
  963.                                         if(short_ok(num,TRUE)){
  964.                                                 op(4+reg*8+64);
  965.                                                 op(0x24);
  966.                                                 op(num);
  967.                                         }
  968.                                         else{
  969.                                                 op(4+reg*8+128);
  970.                                                 op(0x24);
  971.                                                 outdword(num);
  972.                                         }
  973.                                 }
  974.                                 else{
  975.                                         op((am32==FALSE?6:5)+reg*8+64);
  976.                                         op((am32==FALSE?4:8));//mov ESI,[ebp+4]
  977.                                 }
  978.                                 RegAddNum(reg);
  979.                                 op(0x50+reg);   //push reg
  980.                                 warningreg(regs[am32][reg]);
  981.                         }
  982.                 }
  983.                 else if(structadr.sib==THIS_REG){
  984.                         if(structadr.number/*size*/!=0){
  985.                                 int reg=GetRegister(1);
  986.                                 if(reg==structadr.rm)RegAddNum(reg);
  987.                                 else{
  988.                                         if(am32==FALSE){
  989.                                                 switch(structadr.rm){
  990.                                                         case BX:
  991.                                                                 structadr.rm=7;
  992.                                                                 break;
  993.                                                         case DI:
  994.                                                                 structadr.rm=5;
  995.                                                                 break;
  996.                                                         case SI:
  997.                                                                 structadr.rm=4;
  998.                                                                 break;
  999.                                                         case BP:
  1000.                                                                 structadr.rm=6;
  1001.                                                                 break;
  1002.                                                         default:
  1003.                                                                 regBXDISIBPexpected();
  1004.                                                 }
  1005.                                                 structadr.sib=CODE16;
  1006.                                         }
  1007.                                         else structadr.sib=CODE32;
  1008.                                         structadr.rm|=(structadr.number<128?rm_mod01:rm_mod10);
  1009.                                         op(0x8d);       //lea reg [reg2+num]
  1010.                                         op(structadr.rm+reg*8);
  1011.                                         outaddress(&structadr);
  1012.                                 }
  1013.                                 op(0x50+reg);
  1014.                                 warningreg(regs[am32][reg]);
  1015.                         }
  1016.                         else op(0x50+structadr.rm);
  1017.                 }
  1018.                 else if(structadr.sib==THIS_NEW){
  1019.                         RunNew(structadr.number);
  1020.                         op(0x50);
  1021.                 }
  1022.                 else if(structadr.sib==THIS_ZEROSIZE){
  1023.                         outword(0x6a);  //push 0
  1024.                 }
  1025.                 else{
  1026. //                      printf("post=%d\n",structadr.post);
  1027.                         if(structadr.post==LOCAL){
  1028.                                 int reg=GetRegister(1);
  1029.                                 structadr.post=0;
  1030.                                 outseg(&structadr,2);
  1031.                                 op(0x8d);
  1032.                                 op(structadr.rm+reg*8);
  1033.                                 outaddress(&structadr);
  1034.                                 op(0x50+reg);
  1035.                                 warningreg(regs[am32][reg]);
  1036.                         }
  1037.                         else{
  1038.                                 if(strinf.bufstr){
  1039.                                         int reg=GetRegister(1);
  1040.                                         int newreg;
  1041.                                         if((newreg=CheckIDXReg(strinf.bufstr,strinf.size,reg))!=NOINREG){
  1042.                                                 if(newreg!=SKIPREG){
  1043.                                                         if(am32==FALSE&&newreg!=BX&&newreg!=DI&&newreg!=SI&&newreg!=BP)goto noopt;
  1044.                                                         waralreadinitreg(regs[am32][reg],regs[am32][newreg]);
  1045.                                                         reg=newreg;
  1046.                                                 }
  1047.                                                 free(strinf.bufstr);
  1048.                                                 goto cont1;
  1049.                                         }
  1050. noopt:
  1051.                                         if(newreg=CheckMassiv(strinf.bufstr,strinf.size,reg)!=-1)reg=newreg;
  1052. cont1:
  1053.                                         strinf.bufstr=NULL;
  1054.                                         RegAddNum(reg);
  1055.                                         op(0x50+reg);
  1056.                                 }
  1057.                                 else{
  1058.                                         op(0x68);
  1059.                                         if(structadr.post/*&&structadr.post!=USED_DIN_VAR*/)setwordpost(&structadr);
  1060.                                         else if(FixUp)AddReloc();
  1061.                                         if(am32==FALSE)outword((unsigned int)structadr.number);
  1062.                                         else outdword(structadr.number);
  1063.                                 }
  1064.                         }
  1065.                 }
  1066.                 snum+=(am32==FALSE?2:4);
  1067.                 addESP+=(am32==FALSE?2:4);
  1068.         }
  1069.         if(typep&f_far)op(0x0e);        //push cs
  1070.         return snum;
  1071. }
  1072.  
  1073. int doanyproc(int jumpsend)
  1074. {
  1075. unsigned int cloc,snum;
  1076. int returnvalue,dynamicindex;
  1077. int regs;
  1078.         if(tok2==tk_colon){
  1079.                 preerror("dublication global label");
  1080.                 nexttok();
  1081.                 return 0;
  1082.         }
  1083.         cloc=(unsigned int)itok.number;  /* get address or handle */
  1084.         returnvalue=itok.rm;
  1085.         regs=itok.post;
  1086. //      printf("regs=%08X name=%s\n",regs,itok.name);
  1087.         int flag=itok.flag;
  1088.         if(itok.npointr)dopointerproc();
  1089.         else{
  1090.                 if((itok.flag&f_inline)!=0&&(useinline==TRUE||(useinline==2&&optimizespeed))){
  1091.                         if(macros(tk_void)!=0)return(returnvalue);
  1092.                 }
  1093.                 dynamicindex=itok.segm;
  1094.  
  1095. //      printf("%s %08X seg=%d\n",rec->recid/*itok.name*/,itok.flag,itok.segm);
  1096.                 if(itok.segm==DYNAMIC){
  1097.                         itok.segm=DYNAMIC_USED;
  1098.                         updatetree();
  1099.                 }
  1100.                 unsigned int oaddESP=addESP;
  1101.                 snum=initparamproc();
  1102.                 if((flag&f_typeproc)!=tp_cdecl){
  1103.                         snum=0;
  1104.                         addESP=oaddESP;
  1105.                 }
  1106.                 if(dynamicindex<NOT_DYNAMIC){   //фшэрьшўхёър  яЁюЎхфєЁр
  1107.                         addacall(cloc,(unsigned char)(am32!=FALSE?CALL_32:CALL_NEAR));
  1108.                         if(jumpsend)jumploc0();
  1109.                         else{
  1110.                                 callloc0();
  1111.                                 if(snum!=0)CorrectStack(snum);
  1112.                         }
  1113.                 }
  1114.                 else{
  1115.                         if(jumpsend)jumploc(cloc);
  1116.                         else{
  1117.                                 callloc(cloc);
  1118.                                 if(snum!=0)CorrectStack(snum);
  1119.                         }
  1120.                 }
  1121.         }
  1122. #ifdef OPTVARCONST
  1123.         if(flag&f_useidx)ClearLVIC();
  1124.         else FreeGlobalConst();
  1125. #endif
  1126.         clearregstat(regs);
  1127.         return(returnvalue);
  1128. }
  1129.  
  1130. int  doid(char uppercase,int expectedreturn)
  1131. {
  1132. int cnum;
  1133.         if(tok2==tk_colon){     // if a label
  1134. #ifdef OPTVARCONST
  1135.                 ClearLVIC();
  1136. #endif
  1137.                 RestoreStack();
  1138.                 clearregstat();
  1139.                 cnum=FindOff((unsigned char *)itok.name,CS);
  1140.                 if(uppercase){
  1141.                         localrec *ptr=addlocalvar(itok.name,tk_number,outptr,TRUE);
  1142.                         if(FixUp)ptr->rec.flag=f_reloc;
  1143.                 }
  1144.                 else{
  1145.                         tok=tk_proc;
  1146.                         itok.rm=tk_void;
  1147.                         itok.number=outptr;
  1148.                         itok.segm=NOT_DYNAMIC;
  1149.                         itok.flag=0;
  1150.                         string[0]=0;
  1151.                         itok.type=tp_ucnovn;
  1152.                         addtotree(itok.name);
  1153.                         itok.rec->count=cnum;
  1154.                 }
  1155.                 nexttok();      // move past id
  1156.                 nexttok();      // move past :
  1157.                 return(tokens);
  1158.         }
  1159.         if(tok2==tk_openbracket){
  1160.                 if((cnum=CheckMacros())!=tokens)return cnum;
  1161.                 tobedefined(am32==FALSE?CALL_NEAR:CALL_32,expectedreturn);
  1162.                 cnum=posts-1;
  1163.                 param[0]=0;
  1164.                 int flag=itok.flag;
  1165.                 int exitproc=CheckExitProc();
  1166.                 unsigned int oaddESP=addESP;
  1167.                 if(itok.flag==tp_stdcall){
  1168.                         nexttok();
  1169.                         swapparam();
  1170.                 }
  1171.                 else{
  1172.                         nexttok();
  1173.                         if(uppercase)doregparams();
  1174.                         else doparams();
  1175.                 }
  1176.                 (postbuf+cnum)->loc=outptr+1;
  1177.                 callloc0();                     /* produce CALL [#] */
  1178.                 clearregstat();
  1179.                 addESP=oaddESP;
  1180. #ifdef OPTVARCONST
  1181.                 if(flag&f_useidx)ClearLVIC();
  1182.                 else FreeGlobalConst();
  1183. #endif
  1184.                 retproc=exitproc;
  1185.                 return(expectedreturn);
  1186.         }
  1187.         thisundefined(itok.name);
  1188.         return(tk_long);
  1189. }
  1190.  
  1191. int typesize(int vartype) // тючтЁр∙рхЄ ЁрчьхЁ т срщЄрї ъюфр тючтЁрЄр
  1192. {
  1193.         switch(vartype){
  1194.                 case tk_char:
  1195.                 case tk_byte:  return(1);
  1196.                 case tk_int:
  1197.                 case tk_word:  return(2);
  1198.                 case tk_float:
  1199.                 case tk_dword:
  1200.                 case tk_long:  return(4);
  1201.                 case tk_double:
  1202.                 case tk_qword: return 8;
  1203.         }
  1204.         return(0);
  1205. }
  1206.  
  1207. void FpuSt2Number()
  1208. {
  1209.         op66(r32);  //push EAX
  1210.         op(0x50);
  1211.         CheckInitBP();
  1212.         fistp_stack();
  1213.         RestoreBP();
  1214.         fwait3();
  1215.         op66(r32);
  1216.         op(0x58);       //pop EAX
  1217.         if(cpu<3)cpu=3;
  1218. }
  1219.  
  1220. void FpuSt2QNumber()
  1221. {
  1222.         op66(r32);  //push EAX
  1223.         op(0x50);
  1224.         op66(r32);  //push EAX
  1225.         op(0x50);
  1226.         CheckInitBP();
  1227.         fistp_stack(4);
  1228.         RestoreBP();
  1229.         fwait3();
  1230.         op66(r32);
  1231.         op(0x58+EDX);   //pop EAX
  1232.         op66(r32);
  1233.         op(0x58);       //pop EAX
  1234.         if(cpu<3)cpu=3;
  1235. }
  1236.  
  1237. void fwait3_4()
  1238. {
  1239.         if(chip<4)op(0x9B);
  1240. }
  1241.  
  1242. void  convert_returnvalue(int expectedreturn,int actualreturn)
  1243. {
  1244.         if(expectedreturn==tk_void)return; //17.09.05 17:52
  1245.         if(actualreturn==tk_void/*||expectedreturn==tk_void*/){
  1246.                 retvoid();
  1247.                 return;
  1248.         }
  1249.         switch(expectedreturn){
  1250.                 case tk_byte:
  1251.                 case tk_char:
  1252.                 case tk_word:
  1253.                 case tk_int:
  1254.                   if(actualreturn==tk_float||actualreturn==tk_double){
  1255.                                 op66(r32);
  1256.                                 op(0x50);
  1257.                                 FloatToNumer(actualreturn==tk_float?0:4);
  1258.                         }
  1259.                         else if(actualreturn==tk_fpust)FpuSt2Number();
  1260.                         else if(expectedreturn==tk_word||expectedreturn==tk_int){
  1261.                                 if(actualreturn==tk_char)cbw();
  1262.                                 else if(actualreturn==tk_byte)xorAHAH();
  1263.                         }
  1264.                         break;
  1265.                 case tk_long:
  1266.                 case tk_dword:
  1267.                         switch(actualreturn){
  1268.                                 case tk_char:
  1269.                                         op66(r32);
  1270.                                         op(0x0F); outword(0xC0BE);      //MOVSX EAX,AL
  1271.                                         break;
  1272.                                 case tk_byte:   /* MOVZX EAX,AL */
  1273.                                         op66(r32);
  1274.                                         op(0x0F); outword(0xC0B6);
  1275.                                         break;
  1276.                                 case tk_word:  /* MOVZX EAX,AX */
  1277.                                         op66(r32);
  1278.                                         op(0x0F); outword(0xC0B7);
  1279.                                         break;
  1280.                                 case tk_int:    /* MOVSX EAX,AX */
  1281.                                         op66(r32);
  1282.                                         op(0x0F); outword(0xC0BF);
  1283.                                         break;
  1284.                                 case tk_double:
  1285.                                 case tk_fpust:
  1286.                                         FpuSt2Number();
  1287.                                         break;
  1288. //                              case tk_double:
  1289.                                 case tk_float:
  1290.                                         op66(r32);
  1291.                                         op(0x50);
  1292.                                         FloatToNumer(/*actualreturn==tk_float?0:4*/);
  1293.                                         break;
  1294.                         }
  1295.                         if(cpu<3)cpu=3;
  1296.                         break;
  1297.                 case tk_qword:
  1298.                         switch(actualreturn){
  1299.                                 case tk_char:
  1300.                                         op66(r32);
  1301.                                         op(0x0F); outword(0xC0BE);      //MOVSX EAX,AL
  1302.                                         cwdq(r32);
  1303.                                         break;
  1304.                                 case tk_byte:   /* MOVZX EAX,AL */
  1305.                                         op66(r32);
  1306.                                         op(0x0F); outword(0xC0B6);
  1307.                                         ZeroReg(EDX,r32);
  1308.                                         break;
  1309.                                 case tk_word:  /* MOVZX EAX,AX */
  1310.                                         op66(r32);
  1311.                                         op(0x0F); outword(0xC0B7);
  1312.                                 case tk_dword:
  1313.                                         ZeroReg(EDX,r32);
  1314.                                         break;
  1315.                                 case tk_int:    /* MOVSX EAX,AX */
  1316.                                         op66(r32);
  1317.                                         op(0x0F); outword(0xC0BF);
  1318.                                 case tk_long:
  1319.                                         cwdq(r32);
  1320.                                         break;
  1321.                                 case tk_fpust:
  1322.                                 case tk_double:
  1323.                                         FpuSt2QNumber();
  1324.                                         break;
  1325.                                 case tk_float:
  1326.                                         op66(r32);
  1327.                                         op(0x50);
  1328.                                         FloatToNumer(actualreturn==tk_float?0:4);
  1329.                                         cwdq(r32);
  1330.                                         break;
  1331.                         }
  1332.                         if(cpu<3)cpu=3;
  1333.                         break;
  1334.                 case tk_fpust:
  1335.                         if(tok2==tk_semicolon)break;
  1336.                         switch(actualreturn){
  1337.                                 case tk_char:
  1338.                                         CheckInitBP();
  1339.                                         cbw();
  1340.                                         op66(r32);
  1341.                                         outword(0xDF50);        //push EAX
  1342.                                         goto endfxld;   //fild ss[bp-4]/[esp]
  1343.                                 case tk_byte:
  1344.                                         CheckInitBP();
  1345.                                         xorAHAH();
  1346.                                         op66(r32);
  1347.                                         outword(0xDF50);        //push EAX
  1348.                                         goto endfxld;   //fild ss[bp-4]/[esp]
  1349.                                 case tk_word:
  1350.                                         CheckInitBP();
  1351.                                         op66(r16);
  1352.                                         outword(0x6A);  //push 0
  1353.                                         op66(r16);
  1354.                                         outword(0xDB50);        //push AX
  1355.                                         goto endfxld;   //fild ss[bp-4]/[esp]
  1356.                                 case tk_int:
  1357.                                         CheckInitBP();
  1358.                                         op66(r32);
  1359.                                         outword(0xDF50);        //push eax
  1360.                                         goto endfxld;   //fild ss[bp-4]/[esp]
  1361.                                 case tk_dword:
  1362.                                         CheckInitBP();
  1363.                                         op66(r32);              //push 0L
  1364.                                         outword(0x6A);
  1365.                                         op66(r32);
  1366.                                         op(0x50);       //push EAX
  1367.                                         fildq_stack();
  1368.                                         RestoreBP();
  1369.                                         op66(r32);
  1370.                                         op(0x58);       //pop eax
  1371.                                         op66(r32);
  1372.                                         op(0x58);       //pop eax
  1373.                                         break;
  1374.                                 case tk_long:
  1375.                                         CheckInitBP();
  1376.                                         op66(r32);
  1377.                                         outword(0xDB50);        //push EAX
  1378.                                         goto endfxld;   //fild ss[bp-4]/[esp]
  1379.                                 case tk_float:
  1380.                                         CheckInitBP();
  1381.                                         op66(r32);
  1382.                                         outword(0xd950);        //push EAX
  1383. endfxld:
  1384.                                         fld_stack(4+localsize);
  1385.                                         RestoreBP();
  1386.                                         op66(r32);
  1387.                                         op(0x58);       //pop eax
  1388.                                         break;
  1389.                                 case tk_qword:
  1390. //                              case tk_double:
  1391.                                         CheckInitBP();
  1392.                                         op66(r32);
  1393.                                         op(0x50+EDX);   //push EDX
  1394.                                         op66(r32);
  1395.                                         op(0x50);       //push EAX
  1396. /*                                      if(actualreturn==tk_double){
  1397.                                                 op(0xDD);
  1398.                                                 fld_stack(8+localsize);
  1399.                                         }
  1400.                                         else*/ fildq_stack();
  1401.                                         RestoreBP();
  1402.                                         op66(r32);
  1403.                                         op(0x58);       //pop eax
  1404.                                         op66(r32);
  1405.                                         op(0x58);       //pop eax
  1406.                                         break;
  1407.                         }
  1408.                         if(cpu<3)cpu=3;
  1409.                         break;
  1410.                 default:
  1411. //                      printf("expectedreturn=%d %s %d\n",expectedreturn,(startfileinfo+currentfileinfo)->filename,linenumber);
  1412.                         break;
  1413.         }
  1414. }
  1415.  
  1416. int  procdo(int expectedreturn)
  1417. {
  1418. int actualreturn;
  1419. char idflag=0;
  1420.         switch(tok){
  1421.                 case tk_ID:     idflag++;
  1422.                 case tk_id:
  1423.                         actualreturn=doid(idflag,expectedreturn);
  1424.                         break;
  1425.                 case tk_proc:
  1426.                         actualreturn=doanyproc();
  1427.                         break;
  1428.                 case tk_apiproc:
  1429.                 case tk_undefproc:
  1430.                 case tk_declare:
  1431. //                      if((actualreturn=doanyundefproc())==tk_void)actualreturn=expectedreturn;
  1432.                         actualreturn=doanyundefproc(); //17.09.05 17:56
  1433.                         break;
  1434.                 default: internalerror("Bad tok in procdo();"); break;
  1435.         }
  1436.         convert_returnvalue(expectedreturn,actualreturn);
  1437.         return actualreturn;
  1438. }
  1439.  
  1440. /* +++++++++++++++++++++++ loops and ifs start ++++++++++++++++++++++++ */
  1441.  
  1442. void endcmpfloat()
  1443. {
  1444.         fwait3();
  1445.         outword(0xE0DF);//fstsw ax
  1446.         op(0x9E);
  1447.         RestoreBP();
  1448. }
  1449.  
  1450. int  outcmp(int swapped,int ctok,ITOK *cstok,char *&cbuf,SINFO *cstr,int ctok2,ITOK *cstok2,char *&cbuf2,SINFO *cstr2,int typet)
  1451. {
  1452. unsigned char err=0;
  1453. int typef=0;
  1454. int vop=0;
  1455. long long lnumber;
  1456. unsigned int ofs;
  1457. int i,reg,reg1;
  1458.         if(typet<r16)typet=r16;
  1459.         switch(ctok){
  1460.                 case tk_reg64:
  1461.                         reg=cstok->number/256;
  1462.                         switch(ctok2){
  1463.                                 case tk_reg64:
  1464.                                         reg1=cstok2->number/256;
  1465.                                         for(i=0;i<2;i++){
  1466.                                                 op66(r32);
  1467.                                           op(0x39);     //cmp reg,reg
  1468.                                                 op(0xC0+reg+reg1*8);
  1469.                                                 if(i==1)break;
  1470.                                                 outword(0x75);
  1471.                                                 ofs=outptr;
  1472.                                                 reg=cstok->number&255;
  1473.                                                 reg1=cstok2->number&255;
  1474.                                         }
  1475.                                         output[ofs-1]=outptr-ofs;
  1476.                                         break;
  1477.                                 case tk_number:
  1478.                                 case tk_postnumber:
  1479.                                 case tk_undefofs:
  1480.                                         lnumber=cstok2->lnumber>>32;
  1481.                                         for(i=0;i<2;i++){
  1482.                                                 op66(r32);
  1483.                                         //яЁютхЁър эр тючьюцэюёЄ№ сюыхх ъюЁюЄъюую ъюфр
  1484.                                                 if((cstok2->flag&f_reloc)==0&&ctok2!=tk_postnumber&&ctok2!=tk_undefofs&&
  1485.                                                         short_ok(lnumber,TRUE)){
  1486.                                                         if(!lnumber){
  1487.                                                                 op(0x85);       //test reg,reg
  1488.                                                                 op(0xc0+reg*9);
  1489.                                                         }
  1490.                                                         else{
  1491.                                                                 op(0x83);       //cmp reg,
  1492.                                                                 op(0xF8+reg);
  1493.                                                                 op(lnumber);
  1494.                                                         }
  1495.                                                 }
  1496.                                                 else{
  1497.                                                         if(reg==AX)op(0x3D);
  1498.                                                         else{
  1499.                                                                 op(0x81);
  1500.                                                                 op(0xF8+reg);
  1501.                                                         }
  1502.                                                         if(i==1){
  1503.                                                                 if(ctok2==tk_postnumber)(cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1504.                                                                 else if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1505.                                                                 if(ctok2==tk_undefofs)AddUndefOff(2,cstok2->name);
  1506.                                                         }
  1507.                                                         outdword(cstok2->number);
  1508.                                                 }
  1509.                                                 if(i==1)break;
  1510.                                                 outword(0x75);
  1511.                                                 ofs=outptr;
  1512.                                                 reg=cstok->number&255;
  1513.                                         }
  1514.                                         output[ofs-1]=outptr-ofs;
  1515.                                         break;
  1516.                                 default:
  1517.                                         if(swapped)err=1;
  1518.                                         else return(outcmp(1,ctok2,cstok2,cbuf2,cstr2,ctok,cstok,cbuf,cstr,typet));
  1519.                                         break;
  1520.                         }
  1521.                         break;
  1522.                 case tk_reg32:
  1523.                 case tk_reg:
  1524.                         switch(ctok2){
  1525.                                 case tk_reg:
  1526.                                 case tk_reg32:
  1527.                                         if(ctok!=ctok2)err=1;
  1528.                                         else{
  1529.                                                 op66(typet);
  1530.                                           op(0x39);     //cmp reg,reg
  1531.                                                 op(0xC0+(unsigned int)cstok->number+(unsigned int)cstok2->number*8);
  1532.                                         }
  1533.                                         break;
  1534.                                 case tk_number:
  1535.                                         if(cstok2->number==0&&(cstok2->flag&f_reloc)==0){
  1536.                                                 op66(typet);
  1537.                                                 op(0x85);       //test reg,reg
  1538.                                                 op(0xc0+(unsigned int)cstok->number*9);
  1539.                                                 break;
  1540.                                         }
  1541.                                 case tk_postnumber:
  1542.                                 case tk_undefofs:
  1543.                                         op66(typet);
  1544.                                         //яЁютхЁър эр тючьюцэюёЄ№ сюыхх ъюЁюЄъюую ъюфр
  1545.                                         if((cstok2->flag&f_reloc)==0&&ctok2!=tk_postnumber&&ctok2!=tk_undefofs&&
  1546.                                                         short_ok(cstok2->number,ctok==tk_reg?FALSE:TRUE)){
  1547.                                                 op(0x83);       //cmp reg,
  1548.                                                 op(0xF8+(unsigned int)cstok->number);
  1549.                                                 op(cstok2->number);
  1550.                                                 break;
  1551.                                         }
  1552.                                         if(cstok->number==AX)op(0x3D);
  1553.                                         else{
  1554.                                                 op(0x81);
  1555.                                                 op(0xF8+(unsigned int)cstok->number);
  1556.                                         }
  1557.                                         if(ctok2==tk_postnumber)(cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1558.                                         else if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1559.                                         if(ctok2==tk_undefofs)AddUndefOff(2,cstok2->name);
  1560.                                         if(ctok==tk_reg)outword((unsigned int)cstok2->number);
  1561.                                         else outdword(cstok2->number);
  1562.                                         break;
  1563.                                 default:
  1564.                                         if(swapped)err=1;
  1565.                                         else return(outcmp(1,ctok2,cstok2,cbuf2,cstr2,ctok,cstok,cbuf,cstr,typet));
  1566.                                         break;
  1567.                         }
  1568.                         break;
  1569.                 case tk_qwordvar:
  1570.                         cstok->number+=4;
  1571.                         compressoffset(cstok);
  1572.                         switch(ctok2){
  1573.                                 case tk_postnumber:
  1574.                                 case tk_number:
  1575.                                 case tk_undefofs:
  1576.                                         lnumber=cstok2->lnumber>>32;
  1577.                                         CheckAllMassiv(cbuf,8,cstr,cstok);
  1578.                                         for(i=0;i<2;i++){
  1579.                                                 op66(r32);
  1580.                                                 outseg(cstok,2);
  1581.                                         //яЁютхЁър эр тючьюцэюёЄ№ сюыхх ъюЁюЄъюую ъюфр
  1582.                                                 if((cstok2->flag&f_reloc)==0&&ctok2!=tk_postnumber&&ctok2!=tk_undefofs&&
  1583.                                                                 short_ok(lnumber,1)){
  1584.                                                         op(0x83);
  1585.                                                         op(0x38+cstok->rm);
  1586.                                                         outaddress(cstok);
  1587.                                                         op(lnumber);
  1588.                                                 }
  1589.                                                 else{
  1590.                                                         op(0x81);
  1591.                                                         op(0x38+cstok->rm);
  1592.                                                         outaddress(cstok);
  1593.                                                         if(i==1){
  1594.                                                                 if(ctok2==tk_postnumber)(cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1595.                                                                 else if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1596.                                                                 if(ctok2==tk_undefofs)AddUndefOff(2,cstok2->name);
  1597.                                                         }
  1598.                                                         outdword(lnumber);
  1599.                                                 }
  1600.                                                 if(i==1)break;
  1601.                                                 outword(0x75);
  1602.                                                 ofs=outptr;
  1603.                                                 cstok->number-=4;
  1604.                                                 compressoffset(cstok);
  1605.                                                 lnumber=cstok2->lnumber;
  1606.                                         }
  1607.                                         output[ofs-1]=outptr-ofs;
  1608.                                         break;
  1609.                                 case tk_reg64:
  1610.                                         CheckAllMassiv(cbuf,8,cstr,cstok);
  1611.                                         reg=cstok2->number/256;
  1612.                                         for(i=0;i<2;i++){
  1613.                                                 op66(r32);
  1614.                                                 outseg(cstok,2);
  1615.                                                 op(0x39); /* CMP [word],AX */
  1616.                                                 op(cstok->rm+reg*8);
  1617.                                                 outaddress(cstok);
  1618.                                                 if(i==1)break;
  1619.                                                 reg=cstok2->number&255;
  1620.                                                 outword(0x75);
  1621.                                                 ofs=outptr;
  1622.                                                 cstok->number-=4;
  1623.                                                 compressoffset(cstok);
  1624.                                         }
  1625.                                         output[ofs-1]=outptr-ofs;
  1626.                                         break;
  1627.                                 default:
  1628.                                         i=EAX|(EDX*256);
  1629.                                         getintoreg64(i);
  1630.                                         doregmath64(i);
  1631.                                         CheckAllMassiv(cbuf,8,cstr,cstok);
  1632.                                         reg=EDX;
  1633.                                         for(i=0;i<2;i++){
  1634.                                                 op66(r32);
  1635.                                                 outseg(cstok,2);
  1636.                                                 op(0x39); /* CMP [word],AX */
  1637.                                                 op(cstok->rm+reg*8);
  1638.                                                 outaddress(cstok);
  1639.                                                 if(i==1)break;
  1640.                                                 reg=EAX;
  1641.                                                 outword(0x75);
  1642.                                                 ofs=outptr;
  1643.                                                 cstok->number-=4;
  1644.                                                 compressoffset(cstok);
  1645.                                         }
  1646.                                         output[ofs-1]=outptr-ofs;
  1647.                                         break;
  1648.                         }
  1649.                         break;
  1650.                 case tk_intvar:
  1651.                 case tk_wordvar:
  1652.                         if(swapped&&typet==r32)typet=r16;
  1653.                 case tk_longvar:
  1654.                 case tk_dwordvar:
  1655.                         switch(ctok2){
  1656.                                 case tk_reg32:
  1657.                                 case tk_reg:
  1658.                                         CheckAllMassiv(cbuf,typet,cstr,cstok);
  1659.                                         op66(typet);
  1660.                                   outseg(cstok,2);
  1661.                                         op(0x39);
  1662.                                         op((unsigned int)cstok2->number*8+cstok->rm);
  1663.                                         outaddress(cstok);
  1664.                                         break;
  1665.                                 case tk_postnumber:
  1666.                                 case tk_number:
  1667.                                 case tk_undefofs:
  1668.                                         CheckAllMassiv(cbuf,typet,cstr,cstok);
  1669.                                         op66(typet);
  1670.                                         outseg(cstok,2);
  1671.                                         //яЁютхЁър эр тючьюцэюёЄ№ сюыхх ъюЁюЄъюую ъюфр
  1672.                                         if((cstok2->flag&f_reloc)==0&&ctok2!=tk_postnumber&&ctok2!=tk_undefofs&&
  1673.                                                         short_ok(cstok2->number,typet/2-1)){
  1674.                                                 op(0x83);
  1675.                                                 op(0x38+cstok->rm);
  1676.                                                 outaddress(cstok);
  1677.                                                 op(cstok2->number);
  1678.                                                 break;
  1679.                                         }
  1680.                                         op(0x81);
  1681.                                         op(0x38+cstok->rm);
  1682.                                         outaddress(cstok);
  1683.                                         if(ctok2==tk_postnumber)(cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1684.                                         else if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1685.                                         if(ctok2==tk_undefofs)AddUndefOff(2,cstok2->name);
  1686.                                         if(typet==r16)outword((unsigned int)cstok2->number);
  1687.                                         else outdword(cstok2->number);
  1688.                                         break;
  1689.                                 case tk_charvar:
  1690.                                 case tk_intvar:
  1691.                                         getinto_e_ax(1,ctok2,cstok2,cbuf2,cstr2,typet);
  1692.                                         CheckAllMassiv(cbuf,typet,cstr,cstok);
  1693.                                         op66(typet);
  1694.                                         outseg(cstok,2);
  1695.                                         op(0x39);       /* CMP [word],AX */
  1696.                                         op(cstok->rm);
  1697.                                         outaddress(cstok);
  1698.                                         break;
  1699.                                 default:
  1700.                                         getinto_e_ax(0,ctok2,cstok2,cbuf2,cstr2,typet);
  1701. //                                      ClearReg(AX);
  1702.                                         CheckAllMassiv(cbuf,typet,cstr,cstok);
  1703.                                         op66(typet);
  1704.                                         outseg(cstok,2);
  1705.                                         op(0x39); /* CMP [word],AX */
  1706.                                         op(cstok->rm);
  1707.                                         outaddress(cstok);
  1708.                                         break;
  1709.                         }
  1710.                         break;
  1711.                 case tk_number:
  1712.                         if(ctok2==tk_postnumber){
  1713.                                 op(0xB8);        /* MOV AX,# */
  1714.                                 if((cstok->flag&f_reloc)!=0)AddReloc(cstok->segm);
  1715.                                 if(am32==FALSE)outword((unsigned int)cstok->number);
  1716.                                 else outdword(cstok->number);
  1717.                                 op(0x3D);                /* CMP AX,# */
  1718.                                 (cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1719.                                 if(am32==FALSE)outword((unsigned int)cstok2->number);
  1720.                                 else outdword(cstok2->number);
  1721.                         }
  1722.                         if(ctok2==tk_number){
  1723.                                 if(cstok2->rm!=tk_float&&cstok->rm!=tk_float){
  1724.                                         if((unsigned long)cstok2->number<256&&(unsigned long)cstok->number<256){
  1725.                                                 op(0xB0);       //mov al,number
  1726.                                                 op(cstok->number);
  1727.                                                 op(0x3C);       //cmp Al,number
  1728.                                                 op(cstok2->number);
  1729.                                         }
  1730.                                         else if((unsigned long)cstok2->number<65536&&               cstok->number<65536){
  1731.                                                 op66(r16);
  1732.                                                 op(0xB8); /* MOV AX,# */
  1733.                                                 if((cstok->flag&f_reloc)!=0)AddReloc(cstok->segm);
  1734.                                                 outword((unsigned int)cstok->number);
  1735.                                                 op66(r16);
  1736.                                                 op(0x3D);       /* CMP AX,# */
  1737.                                                 if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1738.                                                 outword((unsigned int)cstok2->number);
  1739.                                         }
  1740.                                         else{
  1741.                                                 op66(r32);
  1742.                                                 op(0xB8); /* MOV AX,# */
  1743.                                                 if((cstok->flag&f_reloc)!=0)AddReloc(cstok->segm);
  1744.                                                 outdword(cstok->number);
  1745.                                                 op66(r32);
  1746.                                                 op(0x3D);       /* CMP AX,# */
  1747.                                                 if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1748.                                                 outdword(cstok2->number);
  1749.                                         }
  1750.                                 }
  1751.                                 else{
  1752.                                         op(0x55);       //push bp
  1753.                                         outword(0xe589);//mov bp,sp
  1754.                                         op66(r32);
  1755.                                         if(short_ok(cstok->number,TRUE)){       //push num
  1756.                                                 op(0x6A);
  1757.                                                 op(cstok->number);
  1758.                                         }
  1759.                                         else{
  1760.                                                 op(0x68);
  1761.                                                 outdword(cstok->number);
  1762.                                         }
  1763.                                         op66(r32);
  1764.                                         if(short_ok(cstok2->number,TRUE)){      //push num
  1765.                                                 op(0x6A);
  1766.                                                 op(cstok2->number);
  1767.                                         }
  1768.                                         else{
  1769.                                                 op(0x68);
  1770.                                                 outdword(cstok2->number);
  1771.                                         }
  1772.                                         outword(am32==FALSE?0x46d9:0x45d9);
  1773.                                         op(0xfC);//fld ssdword[bp-4]
  1774.                                         op(0xD8);
  1775.                                         outword(0xF85e - am32); //fcomp [bp-8]
  1776.                                         endcmpfloat();
  1777.                                 }
  1778.                         }
  1779.                         else{
  1780.                                 if(swapped)err=1;
  1781.                                 else return(outcmp(1,ctok2,cstok2,cbuf2,cstr2,ctok,cstok,cbuf,cstr,typet));
  1782.                         }
  1783.                         break;
  1784.                 case tk_postnumber:
  1785.                         if(ctok2==tk_number||ctok2==tk_postnumber){
  1786.                                 op(0xB8); /* MOV AX,# */
  1787.                                 (cstok->flag&f_extern)==0?setwordpost(cstok):setwordext(&cstok->number);
  1788.                                 if(am32==FALSE)outword((unsigned int)cstok->number);
  1789.                                 else outdword(cstok->number);
  1790.                                 op(0x3D);       /* CMP AX,# */
  1791.                                 if(ctok2==tk_postnumber)(cstok2->flag&f_extern)==0?setwordpost(cstok2):setwordext(&cstok2->number);
  1792.                                 else if((cstok2->flag&f_reloc)!=0)AddReloc(cstok2->segm);
  1793.                                 if(am32==FALSE)outword((unsigned int)cstok2->number);
  1794.                                 else outdword(cstok2->number);
  1795.                         }
  1796.                         else{
  1797.                                 if(swapped)err=1;
  1798.                                 else return(outcmp(1,ctok2,cstok2,cbuf2,cstr2,ctok,cstok,cbuf,cstr,typet));
  1799.                         }
  1800.                         break;
  1801.                 case tk_charvar:
  1802.                 case tk_bytevar:
  1803.                         switch(ctok2){
  1804.                                 case tk_number:
  1805.                                         CheckAllMassiv(cbuf,1,cstr,cstok);
  1806.                                         outseg(cstok,2);
  1807.                                         op(0x80);  /* CMP [byte],# */
  1808.                                         op(0x38+cstok->rm);
  1809.                                         outaddress(cstok);
  1810.                                         op((unsigned int)cstok2->number);
  1811.                                         break;
  1812.                                 case tk_reg:
  1813.                                 case tk_reg32:
  1814.                                         if(cstok2->number>3)goto defchar;
  1815.                                 case tk_beg:
  1816.                                         CheckAllMassiv(cbuf,1,cstr,cstok);
  1817.                                         outseg(cstok,2);
  1818.                                         op(0x38);        /* CMP [byte],beg */
  1819.                                         op((unsigned int)cstok2->number*8+cstok->rm);
  1820.                                         outaddress(cstok);
  1821.                                         break;
  1822.                                 default:
  1823. defchar:
  1824.                                         getintoal(ctok2,cstok2,cbuf2,cstr2);
  1825.                                         CheckAllMassiv(cbuf,1,cstr,cstok);
  1826.                                         outseg(cstok,2);
  1827.                                         op(0x38);       /* CMP [byte],AL */
  1828.                                         op(cstok->rm);
  1829.                                         outaddress(cstok);
  1830.                                         break;
  1831.                         }
  1832.                         break;
  1833.                 case tk_beg:
  1834.                         switch(ctok2){
  1835.                                 case tk_number:
  1836.                                         if(cstok2->number==0){
  1837.                                                 op(0x84);       //test beg,beg
  1838.                                                 op(0xc0+(unsigned int)cstok->number*9);
  1839.                                                 break;
  1840.                                         }
  1841.                                         if((unsigned int)cstok->number==AL)op(0x3C);
  1842.                                         else{
  1843.                                                 op(0x80);
  1844.                                                 op(0xF8+(unsigned int)cstok->number);
  1845.                                         }
  1846.                                         op((unsigned int)cstok2->number);
  1847.                                         break;
  1848.                                 case tk_beg:
  1849.                                         op(0x38);
  1850.                                         op(0xC0+(unsigned int)cstok->number+(unsigned int)cstok2->number*8);
  1851.                                         break;
  1852.                                 case tk_reg:
  1853.                                         if((unsigned int)cstok2->number<=BX){   /* CMP beg,beg */
  1854.                                                 op(0x38);
  1855.                                                 op(0xC0+(unsigned int)cstok->number+(unsigned int)cstok2->number*8);
  1856.                                         }
  1857.                                         else{
  1858.                                                 op66(r16);
  1859.                                                 op(0x89);                                       /* MOV AX,reg */
  1860.                                                 op(0xC0+(unsigned int)cstok2->number*8);
  1861.                                                 op(0x38);                       /* CMP beg,AL */
  1862.                                                 op(0xC0+(unsigned int)cstok->number);
  1863.                                         }
  1864.                                         break;
  1865.                                 default:
  1866.                                         if(swapped)err=1;
  1867.                                         else return(outcmp(1,ctok2,cstok2,cbuf2,cstr2,ctok,cstok,cbuf,cstr,typet));
  1868.                                 break;
  1869.                         }
  1870.                         break;
  1871.                 case tk_doublevar:
  1872.                         vop=4;
  1873.                         goto cont_float;
  1874.                 case tk_fpust:
  1875.                         typef++;
  1876.                         if(cstok->type==tp_modif)typef++;
  1877.                         else{
  1878.                                 if(cstok->number!=0){
  1879.                                         op(0xd9);       //fld st(x)
  1880.                                         op(0xC0+cstok->number);
  1881.                                         typef++;
  1882.                                 }
  1883.                         }
  1884.                 case tk_floatvar:
  1885. cont_float:
  1886.                         switch(ctok2){
  1887.                                 case tk_beg:
  1888.                                         CheckInitBP();
  1889.                                         switch(cstok2->rm){
  1890.                                                 case tk_char:
  1891.                                                 case tk_int:
  1892.                                                 case tk_long:
  1893.                                                         outword(0xBE0F);        /* MOVSX AX,beg */
  1894.                                                         op(0xC0+(unsigned int)cstok2->number);
  1895.                                                         break;
  1896.                                                 default:
  1897.                                                         if((optimizespeed&&chip>3&&chip<7)||cstok2->number==AL){
  1898.                                                                 xorAHAH();
  1899.                                                                 if(cstok2->number!=AL){
  1900.                                                                         op(0x88);
  1901.                                                                         op(0xC0+cstok2->number*8);      //mov al,beg
  1902.                                                                 }
  1903.                                                         }
  1904.                                                         else{
  1905.                                                                 outword(0xB60F);        // MOVZX AX,beg
  1906.                                                                 op(0xC0+(unsigned int)cstok2->number);
  1907.                                                         }
  1908.                                                         break;
  1909.                                         }
  1910.                                         outword(0xDF50);        //push AX
  1911.                                         fld_stack(2+localsize);
  1912.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  1913.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  1914.                                         else{
  1915.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  1916.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  1917.                                                 outseg(cstok,2);        //fcomp var
  1918.                                                 op(0xd8+vop);
  1919.                                                 op(cstok->rm+0x18);
  1920.                                                 outaddress(cstok);
  1921.                                         }
  1922.                                         op(0x58);       // pop EAX
  1923.                                         endcmpfloat();
  1924.                                         swapped=1;
  1925.                                         break;
  1926.                                 case tk_reg:
  1927.                                         CheckInitBP();
  1928.                                         op66(r32);
  1929.                                         switch(cstok2->rm){
  1930.                                                 case tk_char:
  1931.                                                 case tk_int:
  1932.                                                 case tk_long:
  1933.                                                         outword(0xBF0F);        /* MOVSX EAX,reg */
  1934.                                                         break;
  1935.                                                 default:
  1936.                                                         if(optimizespeed&&chip>3&&chip<7&&cstok2->number!=AX){
  1937.                                                                 outword(0xC031);        // xor EAX,EAX
  1938.                                                                 op66(r16);
  1939.                                                                 op(0x8B);
  1940.                                                         }
  1941.                                                         else outword(0xB70F);   // MOVZX EAX,reg
  1942.                                                         break;
  1943.                                         }
  1944.                                         op(0xC0+(unsigned int)cstok2->number);
  1945.                                         op66(r32);
  1946.                                         outword(0xDB50);        //push EAX
  1947.                                         fld_stack(4+localsize);
  1948.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  1949.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  1950.                                         else{
  1951.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  1952.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  1953.                                                 outseg(cstok,2);        //fcomp var
  1954.                                                 op(0xd8+vop);
  1955.                                                 op(cstok->rm+0x18);
  1956.                                                 outaddress(cstok);
  1957.                                         }
  1958.                                         op66(r32);
  1959.                                         op(0x58);       // pop EAX
  1960.                                         endcmpfloat();
  1961.                                         swapped=1;
  1962.                                         break;
  1963.                                 case tk_reg32:
  1964.                                         CheckInitBP();
  1965.                                         if(cstok2->rm==tk_float){
  1966.                                                 op66(r32);
  1967.                                                 op(0x50+(unsigned int)cstok2->number);  //push reg32
  1968.                                                 op(0xd9);
  1969.                                                 fld_stack(4+localsize);
  1970.                                                 if(typef==2)outword(0xD9DE);    //FCOMPP
  1971.                                                 else if(typef==1)outword(0xD9D8);       //FCOMP
  1972.                                                 else{
  1973.                                                         if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  1974.                                                         CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  1975.                                                         outseg(cstok,2);        //fcomp var
  1976.                                                         op(0xd8+vop);
  1977.                                                         op(cstok->rm+0x18);
  1978.                                                         outaddress(cstok);
  1979.                                                 }
  1980.                                                 op66(r32);
  1981.                                                 op(0x58);       // pop EAX
  1982.                                         }
  1983.                                         else{
  1984.                                                 if(cstok2->rm!=tk_char&&cstok2->rm!=tk_int&&cstok2->rm!=tk_long){
  1985.                                                         typet=tk_word;
  1986.                                                         op66(r32);
  1987.                                                         outword(0x6a);  //$push 0
  1988.                                                         if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  1989.                                                 }
  1990.                                                 op66(r32);
  1991.                                                 op(0x50+cstok2->number); //push reg32
  1992.                                                 if(typet!=r16)fildq_stack();
  1993.                                                 else{
  1994.                                                         op(0xdb);
  1995.                                                         fld_stack(4+localsize);
  1996.                                                 }
  1997.                                                 if(typef==2)outword(0xD9DE);    //FCOMPP
  1998.                                                 else if(typef==1)outword(0xD9D8);       //FCOMP
  1999.                                                 else{
  2000.                                                         if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  2001.                                                         CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2002.                                                         outseg(cstok,2);        //fcomp var
  2003.                                                         op(0xd8+vop);
  2004.                                                         op(cstok->rm+0x18);
  2005.                                                         outaddress(cstok);
  2006.                                                 }
  2007.                                                 if(typet!=r16){
  2008.                                                         if(optimizespeed||am32==FALSE){
  2009.                                                                 outword(0xC483);
  2010.                                                                 op(8);
  2011.                                                         }
  2012.                                                         else{
  2013.                                                                 op(0x58);       // pop EAX
  2014.                                                                 op(0x58);       // pop EAX
  2015.                                                         }
  2016.                                                 }
  2017.                                                 else{
  2018.                                                         op66(r32);
  2019.                                                         op(0x58);       // pop EAX
  2020.                                                 }
  2021.                                         }
  2022.                                         endcmpfloat();
  2023.                                         swapped=1;
  2024.                                         break;
  2025.                                 case tk_charvar:
  2026.                                         CheckAllMassiv(cbuf2,1,cstr2,cstok2);
  2027.                                         outseg(cstok2,3);       /* MOVSX AX,[charvar] */
  2028.                                         outword(0xBE0F); op(cstok2->rm);
  2029.                                         outaddress(cstok2);
  2030.                                         CheckInitBP();
  2031.                                         outword(0xdf50);        //push ax
  2032.                                         fld_stack(2+localsize);
  2033.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  2034.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  2035.                                         else{
  2036.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  2037.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2038.                                                 outseg(cstok,2);        //fcomp var
  2039.                                                 op(0xd8+vop);
  2040.                                                 op(cstok->rm+0x18);
  2041.                                                 outaddress(cstok);
  2042.                                         }
  2043.                                         op(0x58);       // pop EAX
  2044.                                         endcmpfloat();
  2045.                                         swapped=1;
  2046.                                         break;
  2047.                                 case tk_intvar:
  2048.                                         CheckAllMassiv(cbuf2,2,cstr2,cstok2);
  2049.                                         outseg(cstok2,2);
  2050.                                         if(typef){
  2051.                                                 op(0xDE);       //ficomp var2
  2052.                                                 op(cstok2->rm+0x08+typef*8);
  2053.                                                 outaddress(cstok2);
  2054.                                         }
  2055.                                         else{
  2056.                                                 op(0xdf);       //fild var
  2057.                                                 op(cstok2->rm);
  2058.                                                 outaddress(cstok2);
  2059.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2060.                                                 outseg(cstok,2);        //fcomp var
  2061.                                                 op(0xd8+vop);
  2062.                                                 op(cstok->rm+0x18);
  2063.                                                 outaddress(cstok);
  2064.                                                 swapped=1;
  2065.                                         }
  2066.                                         fwait3_4();
  2067.                                         outword(0xE0DF);//fstsw ax
  2068.                                         op(0x9E);
  2069.                                         break;
  2070.                                 case tk_bytevar:
  2071.                                         CheckAllMassiv(cbuf2,1,cstr2,cstok2);
  2072.                                         if(optimizespeed&&chip>3&&chip<7){
  2073.                                                 outword(0xC031);
  2074.                                                 outseg(cstok2,2);
  2075.                                                 op(0x8A);
  2076.                                         }
  2077.                                         else{
  2078.                                                 outseg(cstok2,3);
  2079.                                                 outword(0xB60F);
  2080.                                         }
  2081.                                         op(cstok2->rm); // MOVZX regL,[byte]
  2082.                                         outaddress(cstok2);
  2083.                                         CheckInitBP();
  2084.                                         outword(0xDF50);        //push ax
  2085.                                         fld_stack(2+localsize);
  2086.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  2087.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  2088.                                         else{
  2089.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  2090.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2091.                                                 outseg(cstok,2);        //fcomp var
  2092.                                                 op(0xd8+vop);
  2093.                                                 op(cstok->rm+0x18);
  2094.                                                 outaddress(cstok);
  2095.                                         }
  2096.                                         op(0x58);       // pop EAX
  2097.                                         endcmpfloat();
  2098.                                         swapped=1;
  2099.                                         break;
  2100.                                 case tk_wordvar:
  2101.                                         CheckInitBP();
  2102.                                         op66(r16);
  2103.                                         outword(0x6a);  //push 0
  2104.                                         CheckAllMassiv(cbuf2,2,cstr2,cstok2);
  2105.                                         op66(r16);
  2106.                                         outseg(cstok2,2); //push var
  2107.                                         op(0xFF);
  2108.                                         op(cstok2->rm+0x30);
  2109.                                         outaddress(cstok2);
  2110.                                         op(0xDB);
  2111.                                         fld_stack(4+localsize);
  2112.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  2113.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  2114.                                         else{
  2115.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=4;
  2116.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2117.                                                 outseg(cstok,2);        //fcomp var
  2118.                                                 op(0xd8+vop);
  2119.                                                 op(cstok->rm+0x18);
  2120.                                                 outaddress(cstok);
  2121.                                         }
  2122.                                         op66(r32);
  2123.                                         op(0x58);       // pop EAX
  2124.                                         endcmpfloat();
  2125.                                         swapped=1;
  2126.                                         break;
  2127.                                 case tk_dwordvar:
  2128.                                         CheckInitBP();
  2129.                                         op66(r32);      //push 0L
  2130.                                         outword(0x6a);
  2131.                                         CheckAllMassiv(cbuf2,4,cstr2,cstok2);
  2132.                                         op66(r32);      //push var
  2133.                                         outseg(cstok2,2);
  2134.                                         op(0xFF);
  2135.                                         op(cstok2->rm+0x30);
  2136.                                         outaddress(cstok2);
  2137.                                         fildq_stack();
  2138.                                         if(typef==2)outword(0xD9DE);    //FCOMPP
  2139.                                         else if(typef==1)outword(0xD9D8);       //FCOMP
  2140.                                         else{
  2141.                                                 if(ESPloc&&am32&&cstok->segm==SS)cstok->number+=8;
  2142.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2143.                                                 outseg(cstok,2);        //fcomp var
  2144.                                                 op(0xd8+vop);
  2145.                                                 op(cstok->rm+0x18);
  2146.                                                 outaddress(cstok);
  2147.                                         }
  2148.                                         if(optimizespeed||am32==FALSE){
  2149.                                                 outword(0xC483);
  2150.                                                 op(8);
  2151.                                         }
  2152.                                         else{
  2153.                                                 op(0x58);       // pop EAX
  2154.                                                 op(0x58);       // pop EAX
  2155.                                         }
  2156.                                         endcmpfloat();
  2157.                                         swapped=1;
  2158.                                         break;
  2159.                                 case tk_longvar:
  2160.                                         CheckAllMassiv(cbuf2,4,cstr2,cstok2);
  2161.                                         outseg(cstok2,2);
  2162.                                         if(typef){
  2163.                                                 op(0xDA);       //ficomp var2
  2164.                                                 op(cstok2->rm+0x08+typef*8);
  2165.                                                 outaddress(cstok2);
  2166.                                         }
  2167.                                         else{
  2168.                                                 op(0xdb);       //fild var
  2169.                                                 op(cstok2->rm);
  2170.                                                 outaddress(cstok2);
  2171.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2172.                                                 outseg(cstok,2);        //fcomp var
  2173.                                                 op(0xd8+vop);
  2174.                                                 op(cstok->rm+0x18);
  2175.                                                 outaddress(cstok);
  2176.                                                 swapped=1;
  2177.                                         }
  2178.                                         endcmpfloat();
  2179.                                         break;
  2180.                                 case tk_number:
  2181.                                         if(!typef){
  2182.                                                 CheckAllMassiv(cbuf,4,cstr,cstok);
  2183.                                                 outseg(cstok,2);        //fld val
  2184.                                                 op(0xd9);
  2185.                                                 op(cstok->rm);
  2186.                                                 outaddress(cstok);
  2187.                                         }
  2188.                                         if(cstok2->rm!=tk_double&&cstok2->rm!=tk_float){
  2189.                                                 cstok2->dnumber=cstok2->lnumber;
  2190.                                                 cstok2->rm=tk_double;
  2191.                                         }
  2192.                                         else if(vop==4&&cstok2->rm==tk_float){
  2193.                                                 cstok2->dnumber=cstok2->fnumber;
  2194.                                                 cstok2->rm=tk_double;
  2195.                                         }
  2196.                                         if(am32&&(cstok2->rm==tk_float&&cstok2->fnumber==0.0)||
  2197.                                         (cstok2->rm==tk_double&&cstok2->dnumber==0.0)||cstok2->lnumber==0){
  2198.                                                 outword(0xe4d9);        //ftst
  2199.                                                 if(typef!=1)outword(0xC0DD);    //ffree
  2200.                                         }
  2201.                                         else{
  2202.                                                 op66(r32);
  2203.                                                 int rm;
  2204.                                                 rm=(am32==FALSE?0x1eD8:0x1DD8);
  2205.                                                 if(typef==1)rm-=0x800;
  2206.                                                 if(cstok2->rm==tk_double||vop==4)rm+=4;
  2207.                                                 outword(rm);    //fcom(p)
  2208.                                                 AddFloatConst(cstok2->lnumber,cstok2->rm);
  2209.                                                 outword(0);
  2210.                                                 if(am32)outword(0);
  2211.                                         }
  2212.                                         endcmpfloat();
  2213.                                         break;
  2214.                                 case tk_floatvar:
  2215.                                         if(!typef){
  2216.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2217.                                                 outseg(cstok,2);        //fld val
  2218.                                                 op(0xd9+vop);
  2219.                                                 op(cstok->rm);
  2220.                                                 outaddress(cstok);
  2221.                                         }
  2222.                                         CheckAllMassiv(cbuf2,4,cstr2,cstok2);
  2223.                                         outseg(cstok2,2);       //fcomp var
  2224.                                         op(0xd8);
  2225.                                         op(cstok2->rm+(typef==1?0x10:0x18));
  2226.                                         outaddress(cstok2);
  2227.                                         endcmpfloat();
  2228.                                         break;
  2229.                                 case tk_doublevar:
  2230.                                         if(!typef){
  2231.                                                 CheckAllMassiv(cbuf,4+vop,cstr,cstok);
  2232.                                                 outseg(cstok,2);        //fld val
  2233.