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

📄 ebook.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rb_stdio.h>
#include <rbasic.h>
#include <rb_string.h>
#include <text.h>
#include <graph.h>
#include <Qgraph.h>
#include <rb_mem.h>
#define fbase 0x8100000
#define is_unk 0
#define is_txt 24
#define is_bmp 25
#define is_wav 26
#define is_jpg 27
#define SET_BAS 10344
#define book_mark_M 440 //电子书书签设置 10*12=120字节
extern void cbmp(u32 loc,u8 x,u8 y);
extern u32 list_fsys(u32 loc);
extern void nsh_text(char *tit,char *txt,u32 size);
extern void jpeg(u8 xp,u8 yp,u32 loc);
void ebook2(char *tit,char *ebk);
extern void (*sys_deamon)();
extern void new_scroll(u32 lc,u32 len);
extern void show_ico(u8 id,u8 xp,u8 yp);
extern void nsh_text(char *tit,char *txt,u32 size);
typedef struct
{
	char ftype[4];//文件类型码 "EBK"
	u32 size;//文件大小
	u32 icnt;//项目个数
	u32 logo;//logo位图信息
	u32 mus;//music信息
	u32 re;//保留区
}ebk_head;//ebk文件头
typedef struct
{
	char name[40];//名称
	u32 loc;//项目地址
	u32 csize;//压缩后大小
	u32 dsize;//解压后大小
}ebk_item;//项目信息

extern void paint_bg(u8 xp,u8 yp,u8 xsp,u8 ysp,u16 *bg);
extern const ebk_bg[];
extern void lzss(void *sou,u32 size,void *de);

extern u32 _fid,_iid,_line;

extern void ebk_font_set(char *M,u8 act);
extern u8 is_basic_run;

void ebk_deamon()
{
   write(10,140,rnd(0xffff),"EBOOK 2.0 FOR GBA PUSH START");
}

int ebk_type(char *name)
{
   int i=0;
   char nn[40];
   while (name[i]!='\0' && name[i]!='.') i++;
   if (name[i]=='\0') return is_unk;
   i++;
   strcpy(nn,name+i);
   str_up(nn);
   if (strcmp(nn,"TXT")==0) return is_txt;
   if (strcmp(nn,"BMP")==0) return is_bmp;
   if (strcmp(nn,"JPG")==0) return is_jpg;
   return is_unk;
}
void ebk_list(u8 id,ebk_item *item)
{
   int i=0;
   /*char name[40];
   while (item->name[i]!='.' && item->name[i]!='\0' && i<39) {name[i]=item->name[i];i++;}
   name[i]='\0';*/
   //Q_box(1,17+id*16,238,30+id*16,RGB(30,30,30));
   i=ebk_type(item->name);
   if (i==is_txt) show_ico(0,2,17+id*16);
   else if(i==is_bmp || i==is_jpg) show_ico(1,2,17+id*16);
   cwrite(19,17+id*16+2,0,item->name);
}
void ebook(char *tit,char *ebk)
{
   u8 done=2;
   u8 start=1;
   int bas=0;
   int sel=0;
   int old=0;
   int i;
   int font=0;
   int type=0;
   char *sv;
   ebk_head head;
   ebk_item item,blank={"",0,0,0};
new_mark:
   get_data(&head,(char *)ebk,sizeof(ebk_head));
   font_set(2);
   if (strcmp(head.ftype,"EBK")!=0)
   {
      arlt("系统提示:","您打开的文件为非ebk格式或者EBK版本过低!系统将尝试以老的方式打开文件.");
      ebook2(tit,ebk);
      return;
   }
   if (head.logo && start)
   {
      cbmp(ebk+head.logo,255,0);
      sys_deamon=ebk_deamon;
      wait_key();
      sys_deamon=NULL;
   }
   if (is_basic_run && _iid<head.icnt)//有书签
   {
      bas=_iid;
      sel=0;
      is_basic_run=1;
      goto do_mark;
   }
   while (1)
   {
      if (start) {start=0;CS_ReadKey();}
      else readkey();
      if (CS_IsKeyDown(KEY_UP) && (bas+sel)>0)
      {
         if (sel) {sel--;done=1;}
         else {bas--;done=3;}
      }
      else if(CS_IsKeyDown(KEY_DOWN) && (bas+sel+1)<head.icnt)
      {
         if (sel<8) {sel++;done=1;}
         else {bas++;done=3;}
      }
      else if(CS_IsKeyDown(KEY_LEFT) && (bas+sel))
      {
         done=3;
         if (bas>=9) bas-=9;
         else {bas=0;sel=0;}
      }
      else if(CS_IsKeyDown(KEY_RIGHT) && (bas+sel+1)<head.icnt)
      {
         done=3;
         if (bas+10<head.icnt)
         {
            bas+=9;
            if (bas+sel+1>=head.icnt) sel=head.icnt-bas-1;
         }
         else
         {
            bas=head.icnt-1;
            sel=0;
         }
      }
      else if(CS_IsKeyDown(KEY_A))
      {
         _line=0;
         do_mark:
         done=2;
         _iid=bas+sel;
         get_data(&item,(void *)(ebk+sizeof(ebk_head)+(bas+sel)*sizeof(ebk_item)),sizeof(ebk_item));
         type=ebk_type(item.name);
         if (type==is_txt)
         {
            if (item.dsize>item.csize)
            {
               sv=(char *)new_malloc(item.dsize+4);
               if (sv==NULL) arlt("系统提示:","没有足够内存来解压缩文件!请注意退出部分程序。");
               else
               {
                  lzss((char *)(ebk+item.loc),item.csize,sv);
                  sv[item.dsize]='\0';
                  nsh_text(item.name,(char *)sv,item.dsize);
                  new_free(sv);
               }
            }
            else nsh_text(item.name,ebk+item.loc,item.dsize);
            if (is_basic_run)//重新载入过书签
            {
               ebk=(char *)_file_loc;
               strcpy(tit,_file);
               goto new_mark;
            }
         }
         else if(type==is_bmp) {cbmp(ebk+item.loc,255,0);wait_key();}
         else if(type==is_jpg) jpeg(255,0,ebk+item.loc);
       }
       else if(CS_IsKeyDown(KEY_B)) {_iid=0xFFFFFFF0;return;}
      if (done==1)
      {
         done=0;
         if (old!=sel) r_box(1,18+16*old,232,17+old*16+13,0,5);
         old=sel;
         r_box(1,18+16*sel,232,17+sel*16+13,0,5);
         new_scroll(bas+sel,head.icnt);
      }
      else if (done==3)
      {
         done=0;
         Q_box(1,17,229,158,RGB(30,30,30));
         for (i=0;i<9;i++)
         {
            get_data(&item,(char *)(ebk+sizeof(ebk_head)+(bas+i)*sizeof(ebk_item)),sizeof(ebk_item));
            ebk_list(i,&item);
            if (bas+i+1>=head.icnt) break;
         }
         old=sel;
         r_box(1,18+16*sel,232,17+sel*16+13,0,5);
         r_line(0,159,249,159,28160,0);
         new_scroll(bas+sel,head.icnt);
      }
      else if (done==2)
      {
         done=0;
         title(tit);
         Q_box(1,17,229,158,RGB(30,30,30));
         r_line(0,0,239,0,28160,0);
         r_line(0,159,239,159,28160,0);
         r_line(0,0,0,159,28160,0);
         r_line(239,0,239,159,28160,0);
         r_line(0,16,239,16,28160,0);
         //cwrite(3,4,0,tit);
         //cwrite(10,3,RGB(30,30,30),tit);
         for (i=0;i<9;i++)
         {
            get_data(&item,(char *)(ebk+sizeof(ebk_head)+(bas+i)*sizeof(ebk_item)),sizeof(ebk_item));
            ebk_list(i,&item);
            if (bas+i+1>=head.icnt) break;
         }
         old=sel;
         r_box(1,18+16*sel,232,17+sel*16+13,0,5);
         r_line(0,159,249,159,28160,0);
         new_scroll(bas+sel,head.icnt);
      }
   }
}
extern u32 cal_loc(char *loc);
void ebook2(char *tit,char *ebk)
{
   u8 items;
   u8 now=0;
   u8 old=0;
   u8 ip=0;
   u8 done=2;
   u8 i;
   Q_box(0,17,239,159,RGB(0,9,16));
   title(tit);
   //r_line(0,16,239,16,RGB(30,30,30),1);
   items=cal_loc(ebk);
   while (1)
   {
      CS_ReadKey();
      if (CS_IsKeyDown(KEY_UP))
      {
         if (now)
         {
            done=1;
            now--;
         }
         else if(ip)
         {
            ip--;
            done=2;
         }
      }
      else if (CS_IsKeyDown(KEY_DOWN))
      {
         if (now<10)
         {
            if (ip+now+1<items) {done=1;now++;}
         }
         else if (ip+1+now<items)
         {
            ip++;
            done=2;
         }
      }
      else if (CS_IsKeyDown(KEY_R)||CS_IsKeyDown(KEY_RIGHT))
      {
         if (ip+12<=items)
         {
            ip+=11;
            done=2;
            if (ip+now+1>items) now=0;
         }
         else {now=items-ip-1;done=1;}
      }
      else if(CS_IsKeyDown(KEY_L)||CS_IsKeyDown(KEY_LEFT))
      {
         if (ip>11)
         {
            ip-=11;
            done=2;
         }
         else if(ip)
         {
            ip=0;
            done=2;
         }
         else {now=0;done=1;}
      }
      else if(CS_IsKeyDown(KEY_B)) {_iid=0xFFFFFFF0;return;}
      else if(CS_IsKeyDown(KEY_A))
      {
         show_text(ebk+10+60*(ip+now)+6,ebk+cal_loc(ebk+10+60*(ip+now)));
         title(tit);
         done=2;
      }
      if (done==2)
      {
         Q_box(0,17,239,19,RGB(0,9,16));
         for (i=0;i<11;i++)
         {
            if (ip+i+1>items) break;
            Q_box(0,17+i*13,239,29+i*13,RGB(0,9,16));
            cwrite(1,18+13*i,RGB(30,30,30),ebk+10+60*(ip+i)+6);
         }
         while (i<11)
         {
            Q_box(0,17+i*13,239,29+i*13,RGB(0,9,16));
            i++;
         }
         r_box(0,17+now*13,239,29+now*13,0,5);
         old=now;
         done=0;
      }
      else if(done==1)
      {
         if (now!=old)
         {
            r_box(0,17+now*13,239,29+now*13,0,5);
            r_box(0,17+old*13,239,29+old*13,0,5);
         }
         old=now;
         done=0;
      }


   }

}

⌨️ 快捷键说明

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