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 + -
显示快捷键?