sbasdat.cpp

来自「一个basic语言的编译工具。」· C++ 代码 · 共 175 行

CPP
175
字号
#include"type.cpp"

uchar ERRMSG[32][32]={
"",
"Express error",           /*1*/
"Division by zero",
"Illegal function call",
"Missing '('",
"Missing ')'",             /*5*/
"","","","","",
"Syntax error",             /*11*/
"Missing '\"'",              /*12*/
"Stack overflow",           /*13*/
"IF without THEN",
"Missing line number",     /*15*/
"No such line number",
"Missing TO",               /*17*/
"FOR-NEXT dismatch",
"Array error",
"No XMS,No array",         /*20*/
"Not enough XMS",
"RETURN without GOSUB",
};
uchar KWN=12;
uchar KW[32][16]={                     /*   Keyword  */
"PRINT","INPUT","IF","GOTO","ELSE","END","FOR","NEXT","DIM","GOSUB","RETURN","ERASE",
};
uchar PUNCMAX=3,PUNC[]={'.',';',','};

/*------------MAIN------------------------*/
uint crc;
EDIT ed;Stack basstack(64);
uint end,lineend;
uchar huge*erp,huge*BP,*BPZ=(uchar far*)0XF000FFFF;
uchar huge*buf;

uchar huge*linename;uint huge*lineplace,LN;
dosmem linen(512),linep(64);

/*------------EDIT-----------------------*/
uchar ns[82],nl[170];
uchar title[]="SimpleBASIC v0.1                 Done by LiYi";

/*------------CALC------------------------*/
uchar far*LBP;
uchar huge*bp;uchar aword[255];
uchar THISIS,THISISASTR[256];
int THISISAINT;
float THISISAFLOAT;
uchar aline[255];
/*-------------CALC--------------------------*/
VAR var;
float unit[30];uchar un;
char P1,P2;
uchar verb[20],verbp[20],vn;
uchar fn[30];
uchar FUNMAX=15;    /*------*/
uchar CF[30],CFI,CALCERR;
uchar verbl[20]={200,10,10,20,20,30,40,40,15,15,5,5,30,5,5,5,5};
uchar fname[30][30]={"SIN","COS","TAN","SQR",
		     "LOG","COT","ABS","INT","ARCSIN",
		     "ARCCOS","ARCTAN","SINH","COSH","TANH"};
double (*fun[30])(double)={sin,cos,tan,SQR,LOG,cot,fabs,INT,
			   atan};


/*---------------TYPE.CPP FUNC--------------*/
uchar strcmpn(uchar huge*a,uchar huge*b)
{
 while(*a){if(*a!=*b)return 0;a++;b++;}
 if(*b==' '||*b=='\n'||*b==0||*b==':')return 1;
 return 0;
}

void EXIT(char*a)
{puts(a);
 exit(1);
}

uchar far * Ma(uint l)
{union REGS r;
 if(l==0)return 0;
 r.h.ah=0x48;
 r.x.bx=l;
 int86(0x21,&r,&r);
 if(r.x.cflag)return 0;
 return (uchar *)(MK_FP(r.x.ax,0));
}

void Free(uchar huge*p)
{union REGS r;struct SREGS s;
 r.h.ah=0x49;s.es=FP_SEG(p);
 int86x(0x21,&r,&r,&s);
}

dosmem::dosmem(uint l)
{uchar far*p2;
 if((p2=Ma(32))==0)EXIT("Not enough memory!");
 if((p=Ma(l))==0)EXIT("Not enough memory!");
 Free(p2);
 setmem(p,l<<4,0);
}

dosmem::~dosmem()
{
 Free(p);
}

uchar dosmem::modmem(uint l)
{union REGS r;struct SREGS sr;
 r.h.ah=0x4a;r.x.bx=l;
 sr.es=FP_SEG(p);
 int86x(0x21,&r,&r,&sr);
 if(r.x.cflag)EXIT("Not enough memory!");
 return 0;
}

uint Stack::popaint()
{register uint a;
 a=*((uint*)(buf.p+sp));
 sp++;sp++;
 return a;
}

uchar Stack::popachar()
{register uchar a;
 a=*((uchar*)(buf.p+sp));
 sp++;
 return a;
}

float Stack::popafloat()
{register float a;
 a=*((float*)(buf.p+sp));
 sp+=4;
 return a;
}

void Stack::pushaint(uint a)
{
 if(sp<2){ERR(13);return;}
 sp--;sp--;
 *((uint*)(buf.p+sp))=a;
}

void Stack::pushachar(uchar a)
{
 if(sp<1){ERR(13);return;}
 sp--;
 *((uchar*)(buf.p+sp))=a;
}

void Stack::pushafloat(float a)
{
 if(sp<4){ERR(13);return;}
 sp-=4;
 *((float*)(buf.p+sp))=a;
}

void Stack::clean()
{
 sp=tl-1;
}
uchar thelastchar(uchar*a)
{
 while(*a)a++;
 a--;return *a;
}

void dellastchar(uchar*a)
{
 while(*a)a++;
 a--;*a=0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?