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

📄 run.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <command.h>
#include <rb_stdio.h>
#include <rb_var.h>
//"LET","PRINT","INPUT","TAB","READ","DATA","RESTORE","END","STOP","REM",//10
//"IF","THEN","ELSE","GOTO","ON","FOR","NEXT","TO","STEP","WHILE","WEND",//21
//"BREAK","DEF","DIM","CLS","LOCATE","COLOR","SCREEN","DRAW","LINE","BOX",//31
//"CIRCLE","WRITE","OPEN","AS","CLOSE","GET","CALL","POKE","DEL","PLAY","GOSUB",//42
//"RET","WAIT","LOAD","SEEK","PUT","EDIT","TEXT","ELLIPSE","MVSCR","SVSCR",//52
//"LDSCR","EXEC","SAVE","SORT","DEAMON","DEND","CLEAN","DCNT","DFRQ","SUB",//62
//"BMP","QUAD","TRIAN","PUSH","POP","OUTPUT","APPEND","RANDOM","SWAP"//71
//命令或语句关健词

#define LDBAS 0x8100000
#define end_tp 8

extern void rb_list(char *exp);
extern int basic_open(u32 loc);
extern int var_mem();//分配变量空间
void rb_ek(char *exp)
{
   rb_error=6;
}
void rb_rem(char *exp)
{
   return;
}

void rb_run(char *exp)
{
   static void (* keyfun[72])(char *)={
   rb_let,rb_print,rb_inputs,rb_tab,rb_read,rb_data,rb_restore,rb_end,rb_stop,rb_rem,
   rb_if,rb_ek,rb_ek,rb_goto,rb_on,rb_for,rb_next,rb_ek,rb_ek,rb_while,rb_wend,
   rb_ek,rb_def,rb_dim,rb_cls,rb_locate,rb_color,rb_screen,rb_draw,rb_line,rb_box,
   rb_circle,rb_write,rb_open,rb_ek,rb_close,rb_get,rb_ek,rb_poke,rb_del,rb_play,rb_gosub,
   rb_ret,rb_ek,rb_load,rb_seek,rb_put,rb_edit,rb_text,rb_ellipse,rb_mvscr,rb_svscr,
   rb_ldscr,rb_ek,rb_save,rb_sort,rb_deamon_com,rb_dend,rb_clean,rb_dcnt,rb_dfrq,rb_sub,
   rb_bmp,rb_quad,rb_trian,rb_ek,rb_ek,rb_ek,rb_ek,rb_ek,rb_swap,rb_textbox};
   if (exp[0]=='@') return;//标识行
   if (exp[0]!='K') {rb_let(exp);return;}//是赋值语句
   keyfun[exp[1]-bg_id](exp+3);
}

void rb_exe()
{
   int sp;
   int cp=0;
   int pp=0xffffffff;
   char code[256*2];
   char *temp;
   u32 loc;
   rb_codes=(char *)rb_bas;
   while (rb_pc<rb_clen && is_basic_run!=basic_end)
   {
      sp=0;
      DmaWait(3);
      //temp[sp]=rb_codes[rb_pc];
      if (pp!=rb_pc)
      {
         loc=(u32)rb_codes+rb_pc;
         DmaCopy(3,loc&0xFFFFFFFC,code+cp,200,16);
         DmaWait(3);
      }
      temp=code+(loc&0x3)+cp;
      while (temp[sp]!=end_tp)
      {
         sp++;
         rb_pc++;
         //temp[sp]=rb_codes[rb_pc];
      }
      temp[sp]='\0';
      if (sp<2) break;
      rb_pc++;
      pp=rb_pc;
      cp=cp?0:256;
      loc=(u32)rb_codes+rb_pc;
      DmaCopy(3,loc&0xFFFFFFFC,code+cp,200,16);//预取下一条语句
      if (temp[0]!='@') rb_run(temp);
      if (rb_error)
      {
         rb_say_error();
         rb_list(temp);
         return;
      }
   }
   return;
}

int basic_load(u32 loc)//载入bascic文件
{
   if (basic_open(loc)) {rb_bas=0;return 1;}
   rb_fbas=loc;
   var_mem();//分配变量空间并初始化
   if (rb_def_cnt) rb_def_mem();//分配自定义函数数据空间
   rb_pc=0;
   return 0;
}

⌨️ 快捷键说明

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