#include #include #include #include #include #include /* DC MENU */ #define RGB565(r,g,b) ( (((r)>>3)<<11) | (((g)>>2)<<5) |((b)>>3) ) static void draw_box(int x,int y,int w,int h,int color) { short *p = vram_s+x+y*640; color |= (color<<16); do { memset4(p,color,w*2); p+=640; } while(--h); } void draw_str(int x,int y,const char *str) { bfont_draw_str(vram_s+x+y*640,640,1,str); } static void draw_center(int y,const char *str) { size_t len = strlen(str); draw_str(640/2-len*12/2,y,str); } #define ISDIR(ent) ((ent)->size==-1) #define MAX_GAMES 256 typedef struct { int n_files; char *name[MAX_GAMES]; } filelist_t; void addlist(filelist_t *list,const char *path) { path+=4; //"/cd/" printf("%s\n",path); list->name[list->n_files++]=strdup(path); } int dirlist(filelist_t *list,char *path) { file_t dir = fs_open(path,O_DIR|O_RDONLY); dirent_t *ent; char *namep; int added = 0; if (dir==0) return -1; namep = path+strlen(path); while((ent = fs_readdir(dir))!=NULL) { if (strcmp(ent->name,".")==0 || strcmp(ent->name,"..")==0) continue; if (ISDIR(ent)) { *namep = '/'; strcpy(namep+1,ent->name); dirlist(list,path); } else if (!added) { char *ext = strrchr(ent->name,'.'); // printf("%s:%s\n",ent->name,ext); if (ext && stricmp(ext+1,"RTL")==0) { // if (stricmp(ent->name+strlen(ent->name)-4,".RTL")==0) { *namep = 0; addlist(list,path); added = 1; } } } *namep = 0; fs_close(dir); return 0; } filelist_t* get_filelist(const char *path) { char tmppath[256]; filelist_t *list; strcpy(tmppath,path); list = malloc(sizeof(filelist_t)); list->n_files = 0; dirlist(list,tmppath); return list; } void free_filelist(filelist_t *list) { int i; if (list==NULL) return; for(i=0;in_files;i++) free(list->name[i]); free(list); } #define NLINE 14 #define FONT_H 24 #define MENU_X 24*2 #define MENU_Y 24*5 #define MENU_W 24*25 #define MENU_H 24*NLINE void menu_draw(filelist_t *list,int offset) { int i; printf("draw %d\n",offset); if (list->n_files==0) { draw_box(MENU_X,MENU_Y,MENU_W,MENU_H,0); draw_center(240,"INSERT GAME CD AND PRESS BUTTON"); } for(i=0;in_files-offset && iname[i+offset]); draw_str(MENU_X,MENU_Y+FONT_H*i,list->name[i+offset]); draw_box(MENU_X+len*12,MENU_Y+FONT_H*i,MENU_W-len*12,FONT_H,0); } } int menu(char path[]) { int index,offset; filelist_t *list=NULL; int prev_buttons = 0; retry: iso_ioctl(0,0,0); if (list) free_filelist(list); list = get_filelist("/cd"); index = offset = 0; if (list->n_files==1) goto fin; menu_draw(list,offset); if (list->n_files) draw_str(MENU_X-24,MENU_Y+(index-offset)*24,""); while(1) { int previndex = index; cont_cond_t cond; uint8 mcont; mcont = maple_first_controller(); if (mcont && cont_get_cond(mcont, &cond)==0) { int buttons,pressed,changed; buttons = cond.buttons^0xffff; changed = buttons ^ prev_buttons; pressed = buttons & changed; prev_buttons = buttons; // if ((pressed & CONT_Y)) tga_save("/pc/quake/menu.tga"); // if ((pressed & CONT_X)) exit(-1); if (pressed & (CONT_START|CONT_A)) { if (list->n_files==0) goto retry; /* start */ break; } if (pressed & CONT_Y) { exit(0); goto retry; } if ((pressed & CONT_DPAD_UP) && index>0) index--; if ((pressed & CONT_DPAD_DOWN) && list && indexn_files-1) index++; } if (previndex!=index) { draw_box(MENU_X-24,MENU_Y+(previndex-offset)*24,24,24,0); if (offset>index) { offset = index; menu_draw(list,offset); } if (offsetname[index]); free_filelist(list); return 0; } static int filecopy(const char *from,const char *to) { int fd = open(from,O_RDONLY); size_t size; char *buf; if (fd==-1) return -1; size = filelength(fd); buf = malloc(size); read(fd,buf,size); close(fd); fd = open(to,O_WRONLY); if (fd==-1) { free(buf); return -1; } write(fd,buf,size); close(fd); free(buf); return 0; } extern char ApogeePath[256]; /* save path */ extern char * ROTTMAPS; extern char * BATTMAPS; void platform_init(void) { char path[256]; draw_center(FONT_H,"Rise of The Triad for Dreamcast"); draw_center(FONT_H*2,"Copyright (C) 1994-1995 Apogee Software, Ltd.") ; draw_center(FONT_H*3,"Copyright (C) 2002-2003 Linux porting team "); draw_center(FONT_H*4,"Copyright (C) 2003 BERO (Dreamcast port) "); draw_center(240,"NOW LOADING"); file_t fd = fs_open("/cd/romdisk" /*"/cd/gothic.ttf"*/,O_RDONLY); if (fd) { char *ptr = (void*)(0x84000000 + 640*480*4);///* cacheable */ + 800*600*2*2; size_t size = fs_total(fd); fs_read(fd,ptr,size); fs_close(fd); printf("romdisk ok\n"); fs_romdisk_mount("/rd",ptr,0); } menu(path); // ROTTMAPS = "HUNTBGIN.RTL"; // BATTMAPS = "HUNTBGIN.RTC"; strcpy(ApogeePath,"/ram"); chdir(path); // filecopy("config.rot","/ram/config.rott"); unpack_files(); } void platform_exit(void) { vid_set_mode(DM_640x480, PM_RGB565); bfont_draw_str(vram_s+640/2-12/2*12+(480/2)*640-12,640,1,"NOW SAVING"); // WriteConfig(); pack_files(); }