deamon.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 122 行

C
122
字号
#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 + =
减小字号Ctrl + -
显示快捷键?