⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sub.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <rb_mem.h>

extern u32 myfopen(char *fname,u32 *size);
extern void rb_get_str(char *exp,char *str);
extern int basic_open(u32 loc);
typedef struct
{
   u8 int_cnt;
   u8 float_cnt;
   u8 str_cnt;
   u8 int_dim_cnt;
   u8 float_dim_cnt;
   u8 mark_cnt;
   u8 def_cnt;
   int *int_var;
   double *float_var;
   char *str_var;
   int **int_dim;
   u8 *int_dim_indx;
   double **float_dim;
   u8 *float_dim_indx;
   u32 *marks;
   u32 *mes;
   u32 bas;
   u32 pc;
   u32 clen;
   u32 fbas;
} RB_DAT;
RB_DAT *rb_sv;
u8 is_in_sub=0;
void rb_save_mes()//保存当前信息
{
   rb_sv=(RB_DAT *)mymalloc(sizeof(RB_DAT));
   if (rb_sv==NULL) {rb_error=1;return;}
   rb_sv->int_cnt=rb_int_cnt;
   rb_sv->float_cnt=rb_float_cnt;
   rb_sv->str_cnt=rb_str_cnt;
   rb_sv->int_dim_cnt=rb_int_dim_cnt;
   rb_sv->float_dim_cnt=rb_float_dim_cnt;
   rb_sv->def_cnt=rb_def_cnt;
   rb_sv->mark_cnt=rb_mark_cnt;
   rb_sv->int_var=rb_int_var;
   rb_int_var=NULL;
   rb_sv->float_var=rb_float_var;
   rb_float_var=NULL;
   rb_sv->str_var=rb_str_var;
   rb_str_var=NULL;
   rb_sv->int_dim=rb_int_dim;
   rb_int_dim=NULL;
   rb_sv->float_dim=rb_float_dim;
   rb_float_dim=NULL;
   rb_sv->int_dim_indx=rb_int_dim_indx;
   rb_int_dim_indx=NULL;
   rb_sv->float_dim_indx=rb_float_dim_indx;
   rb_float_dim_indx=NULL;
   rb_sv->marks=rb_marks;
   rb_marks=NULL;
   rb_sv->pc=rb_pc;
   rb_sv->bas=rb_bas;
   rb_sv->fbas=rb_fbas;
   rb_sv->clen=rb_clen;
   rb_sv->mes=rb_mes;
   rb_mes=(u32 *)mymalloc(4*7);
}
void rb_load_mes()
{
   rb_int_cnt=rb_sv->int_cnt;
   rb_float_cnt=rb_sv->float_cnt;
   rb_str_cnt=rb_sv->str_cnt;
   rb_int_dim_cnt=rb_sv->int_dim_cnt;
   rb_float_dim_cnt=rb_sv->float_dim_cnt;
   rb_def_cnt=rb_sv->def_cnt;
   rb_mark_cnt=rb_sv->mark_cnt;
   rb_int_var=rb_sv->int_var;
   rb_float_var=rb_sv->float_var;
   rb_str_var=rb_sv->str_var;
   rb_int_dim=rb_sv->int_dim;
   rb_int_dim_indx=rb_sv->int_dim_indx;
   rb_float_dim=rb_sv->float_dim;
   rb_float_dim_indx=rb_sv->float_dim_indx;
   rb_marks=rb_sv->marks;
   rb_pc=rb_sv->pc;
   rb_bas=rb_sv->bas;
   rb_fbas=rb_sv->fbas;
   rb_clen=rb_sv->clen;
   myfree(rb_mes);
   rb_mes=rb_sv->mes;
   myfree(rb_sv->marks);
   myfree(rb_sv);
}
void rb_sub(char *exp)
{
   u32 loc,size;
   char fname[str_max_len];
   rb_get_str(exp,fname);
   loc=myfopen(fname,&size);
   if (is_in_sub){rb_error=31;return;}
   if (loc==0) {rb_error=17;return;}
   rb_save_mes();//保存当前数据
   if (rb_error) return;
   if (basic_open(loc)==0)//正常打开BAS文档
   {
      is_in_sub=1;
      rb_fbas=loc;
      rb_pc=0;//设置程序入口
      var_mem();//分配变量空间并初始化
      rb_def_save();
      if (rb_def_cnt) rb_def_mem();//分配自定义函数数据空间
      rb_exe();//执行程序
      if (rb_error==0) is_basic_run=1;//设置basic正常运行态
      free_var();//释放变量空间
      rb_free_def();//释放自定义函数空间
   }
   else rb_error=17;
   rb_def_load();//载入老数据
   is_in_sub=0;
}
   

⌨️ 快捷键说明

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