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

📄 rb_cyc.c

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

#define max_cyc_cnt 15 //最大循环深度

#define cyc_for 1
#define cyc_while 2
#define cyc_sub 3

extern double rb_cal(char *exp);
extern logic_exe(char *exp);

typedef struct
{
   u8 type;
   u8 id;//循环变量代号
   u32 pc;//入口地址
   double end_val;//终止数值
   double step;//步长
   char exp[str_max_len];//条件代码
} rb_cyc;//循环体数据结构

rb_cyc *rb_cycs;//循环体数据存储区
u8 cyc_p=0;//当前循环深度

void rb_for(char *exp)
{
   int i,sp;
   double start;
   char temp[str_max_len];
   if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
   if (exp[0]!='F' || exp[2]!='=') {rb_error=6;return;}//循环变量只能用实型变量
   rb_cycs[cyc_p].id=exp[1]-bg_id;//获得循环变量编号
   rb_cycs[cyc_p].type=cyc_for;//置循环体类型
   i=3;
   sp=0;
   while (1)//获得初始值
   {
      if (exp[i]=='K' && exp[i+1]==bg_id+17) break;
      if (exp[i]=='\0') {rb_error=6;return;}
      temp[sp]=exp[i];
      i++;
      sp++;
   }
   if (sp==0) {rb_error=6;return;}
   temp[sp-1]='\0';
   start=rb_cal(temp);
   i+=3;
   sp=0;
   while (1)//获得终止值
   {
      if (exp[i]=='\0' || (exp[i]=='K' && exp[i+1]==bg_id+18)) break;
      temp[sp]=exp[i];
      i++;
      sp++;
   }
   if (exp[i]=='K')//有step
   {
      temp[sp-1]=='\0';
      rb_cycs[cyc_p].end_val=rb_cal(temp);//置终止数值
      sp=0;i+=3;
      while (exp[i]!='\0')
      {
         temp[sp]=exp[i];
         sp++;i++;
      }
      temp[sp]='\0';
      rb_cycs[cyc_p].step=rb_cal(temp);//置步长
   }
   else //步长取默认值
   {
      temp[sp]='\0';
      rb_cycs[cyc_p].end_val=rb_cal(temp);//置终止数值
      if (rb_cycs[cyc_p].end_val>start) rb_cycs[cyc_p].step=1;
      else rb_cycs[cyc_p].step=-1;
   }
   give_float_val(exp[1]-bg_id,start);//循环变量赋初值
   rb_cycs[cyc_p].pc=rb_pc;//置程序入口
   cyc_p++;
}

void rb_next(char *exp)
{
   int np=cyc_p-1;
   double val;
   if (cyc_p==0 || rb_cycs[np].type!=cyc_for) {rb_error=8;return;}
   val=get_float_val(rb_cycs[np].id);
   val+=rb_cycs[np].step;
   give_float_val(rb_cycs[np].id,val);
   if ((rb_cycs[np].step>=0.0 && val>rb_cycs[np].end_val)
      || (rb_cycs[np].step<0 && val<rb_cycs[np].end_val)) cyc_p--;//循环结束
   else //更新循环变量值
   {
      rb_pc=rb_cycs[np].pc;
   }
}

void rb_while(char *exp)
{
   int i=0;
   if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
   while (exp[i]!='\0')
   {
      rb_cycs[cyc_p].exp[i]=exp[i];
      i++;
   }
   rb_cycs[cyc_p].exp[i]='\0';
   rb_cycs[cyc_p].type=cyc_while;
   rb_cycs[cyc_p].pc=rb_pc;
   cyc_p++;
}

void rb_wend(char *exp)
{
   int np=cyc_p-1;
   if (cyc_p==0 || rb_cycs[np].type!=cyc_while) {rb_error=29;return;}
   if (logic_exe(rb_cycs[np].exp)) rb_pc=rb_cycs[np].pc;//继续执行循环体
   else cyc_p--;//循环结束
}

void rb_gosub(char *exp)
{
   u8 id;
   if (cyc_p>=max_cyc_cnt) {rb_error=27;return;}
   if (exp[0]!='@' || exp[2]!='\0') {rb_error=6;return;}
   rb_cycs[cyc_p].type=cyc_sub;
   rb_cycs[cyc_p].pc=rb_pc;
   rb_pc=rb_marks[exp[1]-bg_id];
   cyc_p++;
   if (rb_pc==0) rb_error=31;
}

void rb_ret(char *exp)
{
   int np=cyc_p-1;
   if (cyc_p==0 || rb_cycs[np].type!=cyc_sub) {rb_error=10;return;}
   rb_pc=rb_cycs[np].pc;
   cyc_p--;
}

void rb_cyc_mem()
{
   rb_cycs=(rb_cyc *)malloc(sizeof(rb_cyc)*max_cyc_cnt);
   cyc_p=0;
}

void free_cyc()
{
   myfree(rb_cycs);
   cyc_p=0;
}
void clean_cyc()
{
   cyc_p=0;
}

⌨️ 快捷键说明

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