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

📄 deamon.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <CsAgb.h>
#include <rbasic.h>
#define end_tp 8
extern int get_para(char *exp,double *nump,char *strp,char *tp);

struct deamon_mes
{
   u8 isrun;//是否正在运行
   u16 dcount;//剩余次数
   u8 dfreq;//频率
   u8 dwait;//剩余等待时间
   u32 dpc;//入口地址
   u32 dbas;//代码基址
};

struct deamon_mes rb_deamon;

void rb_set_deamon(u16 dcount,u8 dfreq,u32 dpc)
{
   if (rb_deamon.isrun || dfreq==0 || dcount==0 || rb_deamon.dpc!=0)
   {
      rb_error=30;
      return;
   }
   rb_deamon.isrun=1;
   rb_deamon.dcount=dcount-1;
   rb_deamon.dfreq=dfreq;
   rb_deamon.dpc=dpc;
   rb_deamon.dbas=rb_bas;
}
void rb_set_deamon_freq(u8 dfreq)
{
   rb_deamon.dfreq=dfreq;
}
void rb_set_deamon_count(u16 dcount)
{
   rb_deamon.dcount=dcount;
}
void rb_dends()
{
   rb_deamon.isrun=0;
   if (rb_deamon.dcount==0) return;
   rb_deamon.dcount--;
   rb_deamon.dwait=rb_deamon.dfreq;
}
void rb_deamon_run()
{
   int sp;
   u8 xp=rb_xp,yp=rb_yp;//save loc
   u32 pc_sv=rb_pc;//保存当前
   u32 bas_sv=rb_bas;//保存代码基址
   char temp[str_max_len];
   rb_deamon.dwait=rb_deamon.dfreq;
   rb_deamon.isrun=1;//置DEAMON为运行态
   rb_pc=rb_deamon.dpc;
   rb_bas=rb_deamon.dbas;
   rb_codes=(char *)rb_bas;
   is_basic_run=1;
   rb_codes=(char *)rb_bas;
   while (rb_pc<rb_clen && rb_error==0 && is_basic_run!=basic_dend)
   {
      sp=0;
      temp[sp]=rb_codes[rb_pc];
      while (temp[sp]!=end_tp)
      {
         sp++;
         rb_pc++;
         temp[sp]=rb_codes[rb_pc];
      }
      temp[sp]='\0';
      rb_pc++;
      if (temp[0]!='@') rb_run(temp);
   }
   rb_pc=pc_sv;//恢复数据
   rb_bas=bas_sv;
   rb_xp=xp;
   rb_yp=yp;
   is_basic_run=basic_dend;
   return;
}
void rb_deamon_clear()
{
   rb_deamon.dpc=0;
   rb_deamon.dcount==0;
   rb_deamon.isrun=0;
}
   
void rb_deamons()
{
   //rb_say_error("Hi.\n");
   if (rb_deamon.dcount==0 || rb_deamon.dpc==0) return;//没有DEAMR语句
   if (rb_deamon.isrun) return;//DEAMON正在运行
   if (rb_deamon.dwait>1) rb_deamon.dwait--;//尚需等待
   else rb_deamon_run();
}

void rb_deamon_com(char *exp)
{
   double x[2];
   if (get_para(exp,x,NULL,"2NN")) return;//取得参数
   rb_set_deamon(x[0],x[1],rb_pc);
   if (rb_error) return;
}
void rb_dend(char *exp)
{
   rb_dends();
   is_basic_run=basic_dend;
}

void rb_dcnt(char *exp)
{
   rb_set_deamon_count(rb_cal(exp));
}

void rb_dfrq(char *exp)
{
   rb_set_deamon_freq(rb_cal(exp));
}

⌨️ 快捷键说明

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