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

📄 dc.c

📁 DC的SEGA_GG模拟器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                        draw_color_rect(165, 190, 150, a, 0.2f, 0.3f, 0.0f, 1.0f, 5.1f, 1);
                        list_menu(b);
                        ta_commit_poly_hdr(&npoly);
                        ta_commit_eol();
                        ta_finish_frame();

                        FirstCont=getButtons(0);
                        FirstKeyb=getKeys();

                        if(FirstCont.ltrig & FirstCont.rtrig) setbrk = 1;
                        if(!(FirstCont.buttons & CONT_DPAD_UP)) { b--; if (b<0) b=3; }
                        if(!(FirstCont.buttons & CONT_DPAD_DOWN)) { b++; if (b>=4) b=0; }
                        if(FirstKeyb == 20992) { b--; if (b<0) b=3; }
                        if(FirstKeyb == 20736) { b++; if (b>=4) b=0; }
                        if(FirstKeyb == 27) setbrk = 1;
                        thd_sleep(150);
                }
                thd_sleep(2000);
                return(MAIN_MENU);
        } else if(o == SELECT_ROM) {
                //strcpy(dir_root,defdir);
                //strcpy(pdir[0],dir_root);
                select_rom();
                return(EXIT_MENU);
        }

        return(MAIN_MENU);
}

/* Song menu choices */
typedef struct {
	char	fn[16];
	int	size;
} entry;
char curdir[64] = "/cd";

#define DC_MAX_FILES 1000
static entry entries[DC_MAX_FILES];

static int num_entries = 0, load_queued = 0;
static int selected = 0, top = 0;

static int framecnt = 0;
static float throb = 0.2f, dthrob = 0.01f;

static void load_song_list() {
	file_t d;

	d = fs_open(curdir, O_RDONLY | O_DIR);
	if (!d) {
                strcpy(curdir, "/cd");
		d = fs_open(curdir, O_RDONLY | O_DIR);
		if (!d) {
			num_entries = 1;
			strcpy(entries[0].fn,"Error!");
			entries[0].size = 0;
			return;
		}
	}
	{
		dirent_t *de;
		num_entries = 0;
                if (strcmp(curdir, "/cd")) {
			strcpy(entries[0].fn, "<..>"); entries[0].size = -1;
			num_entries++;
		}
                while ( (de = fs_readdir(d)) && num_entries < DC_MAX_FILES) {
                        //printf("read entry '%s'\n", de->name);
                        if((de->size<0) || (strcmp(&de->name[strlen(de->name)-3],"ZIP")==0) || (strcmp(&de->name[strlen(de->name)-3],"zip")==0) || (strcmp(&de->name[strlen(de->name)-2],"GG")==0) || (strcmp(&de->name[strlen(de->name)-2],"gg")==0) || (strcmp(&de->name[strlen(de->name)-3],"SMS")==0) || (strcmp(&de->name[strlen(de->name)-3],"sms")==0)) {
                                strcpy(entries[num_entries].fn, de->name);
                                entries[num_entries].size = de->size;
                                num_entries++;
                        }
		}
	}
	fs_close(d);
}

/* Draws the song listing */
//260x50
static void draw_listing() {
        float y = 50.0f;
	int i, esel;

	/* Draw all the song titles */	
	for (i=0; i<14 && (top+i)<num_entries; i++) {
                draw_string(260.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, entries[top+i].fn, 1.5f, 1.5f);
                //draw_poly_strf(32.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, entries[top+i].fn);
		if (entries[top+i].size >= 0) {
                        draw_stringf(260.0f+180.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.5f, 1.5f, "%d bytes", entries[top+i].size);
//                        draw_poly_strf(32.0f+180.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f,
//                                "%d bytes", entries[top+i].size);
		} else {
                        draw_string(260.0f+180.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, "<DIR>", 1.5f, 1.5f);
                        //draw_poly_strf(32.0f+180.0f, y, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, "<DIR>");
		}
		y += 24.0f;
	}
	
	/* Put a highlight bar under one of them */
	esel = (selected - top);
        draw_string(260.0f, 50.0f+esel*24.0f, 100.0f, 1.0f, 1.0f, 0.0f, 1.0f, entries[selected].fn, 1.5f, 1.5f);
        //draw_poly_box(31.0f, 82.0f+esel*24.0f - 1.0f,
        //        609.0f, 82.0f+esel*24.0f + 25.0f, 95.0f,
        //        throb, throb, 0.2f, 0.2f, throb, throb, 0.2f, 0.2f);
}

/* Handle controller input */
int check_controller() {
	static uint8 mcont = 0;
	static int up_moved = 0, down_moved = 0;
	cont_cond_t cond;

	if (!mcont) {
		mcont = maple_first_controller();
                if (!mcont) { return 0; }
	}
        if (cont_get_cond(mcont, &cond)) { return 0; }

	if (!(cond.buttons & CONT_DPAD_UP)) {
		if ((framecnt - up_moved) > 10) {
			if (selected > 0) {
				selected--;
				if (selected < top) {
					top = selected;
				}
			}
			up_moved = framecnt;
		}
	}
	if (!(cond.buttons & CONT_DPAD_DOWN)) {
		if ((framecnt - down_moved) > 10) {
			if (selected < (num_entries - 1)) {
				selected++;
				if (selected >= (top+14)) {
					top++;
				}
			}
			down_moved = framecnt;
		}
	}
	if (cond.ltrig > 0) {
		if ((framecnt - up_moved) > 10) {
			selected -= 14;
			if (selected < 0) selected = 0;
			if (selected < top) top = selected;
			up_moved = framecnt;
		}
	}
	if (cond.rtrig > 0) {
		if ((framecnt - down_moved) > 10) {
			selected += 14;
			if (selected > (num_entries - 1))
				selected = num_entries - 1;
			if (selected >= (top+14))
				top = selected;
			down_moved = framecnt;
		}
	}
        if (!(cond.buttons & CONT_Y)) {
                uint32 hnd;
                int i;

                hnd = fs_open(curdir, O_RDONLY | O_DIR);
                fs_ioctl(hnd, NULL, 0);
                fs_close(hnd);

                strcpy(curdir, "/cd");

                for (i=0; i<DC_MAX_FILES; i++) {
                        strcpy(entries[i].fn,NULL);
                        entries[i].size = 0;
                }

                load_song_list();
        }
	if (!(cond.buttons & CONT_A)) {
                thd_sleep(200);
		if (!strcmp(entries[selected].fn, "Error!")) {
			num_entries = 0;
			load_song_list();
		} else if (entries[selected].size >= 0) {
                        int n,x;
                        char *t_filename;
                        t_filename=malloc(4086*10);
                        //play_s3m(entries[selected].fn, curdir);
                        strcpy(t_filename, curdir);
                        strcat(t_filename, "/");
                        strcat(t_filename, entries[selected].fn);
                        x=load_rom(t_filename);
                        for(n = 0; n < (sizeof(smscrc_list) / sizeof(t_smscrc)); n += 1) {
                                if(cart.crc == smscrc_list[n].crc) {
                                        jpegcover(smscrc_list[n].filename);
                                        dc_print(smscrc_list[n].name);
                                        thd_sleep(2000);
                                }
                        }
                        free(t_filename);
                        return x;
		} else {
			if (!strcmp(entries[selected].fn, "<..>")) {
				int i;
				for (i=strlen(curdir); i>0; i--) {
					if (curdir[i] == '/') {
						curdir[i] = 0;
						break;
					} else
						curdir[i] = 0;
				}
			} else {
				if (strcmp(curdir, "/"))
					strcat(curdir, "/");
				strcat(curdir, entries[selected].fn);
			}
			selected = top = num_entries = 0;
			printf("current directory is now '%s'\n", curdir);
			load_song_list();
		}
	}
        return 0;
}

/* Main rendering of the song menu */
void song_menu_render() {
	/* Draw a background box */
        //draw_poly_box(30.0f, 70.0f, 610.0f, 430.0f, 90.0f, 
        //        0.2f, 0.8f, 0.5f, 0.0f, 0.2f, 0.8f, 0.8f, 0.2f);
        //draw_poly_box(30.0f, 70.0f, 610.0f, 430.0f, 90.0f, 
        //        0.2f, 0.3f, 0.0f, 1.0f, 0.2f, 0.8f, 0.8f, 0.2f);
//
	/* If we don't have a file listing, get it now */
	if (num_entries == 0) {
		if (load_queued < 4) {
//void draw_string(float x, float y, float z, float a, float r, float g, float b, char *str, float xs, float ys);
                                //  32.0f  82.0f
                        draw_string(260.0f, 50.0f, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, "Scanning Directory...", 1.5f, 1.5f);
                        //draw_poly_strf(32.0f, 82.0f, 100.0f, 1.0f, 1.0f, 1.0f, 1.0f, "Scanning Directory...");
			load_queued++;
			return;
		} else {
			load_song_list();
			load_queued = 0;
		}
	}
	
	/* Draw the song listing */
	draw_listing();
	
	/* Adjust the throbber */
	throb += dthrob;
	if (throb < 0.2f || throb > 0.8f) {
		dthrob = -dthrob;
		throb += dthrob;
	}
	
	framecnt++;
}

char *cscroll[] = {
"",
"",
"",
"",
"Credits",
"",
"",
"Dan Potter",
"Sayten",
"Heliophobe",
"ReGex",
"crt0",
"DCGrendel",
"|joey|",
"",
"All the beta",
"testers",
"",
""
};

int select_rom() {
        while(!check_controller()) {
		ta_begin_render();
                display_dcp(splash);
		ta_commit_eol();
		song_menu_render();
		ta_commit_eol();
		ta_finish_frame();
        }

        return(0);
}

int draw_list(int selected, int total, int maxi, int mini) {
        //int i,x,y = (480 - 9*24)/2;
        int i,y = (512 - 9*24)/2;
        //uint16 *uitxrtmp;
        //display_dcp(splash);
        //uitxrtmp = (uint16*)ta_txr_map(gui_txr);
    poly_hdr_t poly;

    ta_poly_hdr_col(&poly, TA_TRANSLUCENT);

    ta_begin_render();

        draw_background();

    ta_commit_eol();
        //draw_color_rect(8, 60, 616, 400, 0.2f, 0.3f, 0.0f, 1.0f, 5.1f, 1);

//        draw_string_center(16, 6.0f, 1.0f, 0.0f, 0.0f, 0.0f, "MP3 Jukebox", 1.5f, 1.5f);
//id draw_string_center(flt y, ft z, ft a, ft r, ft g, ft b, char *strdfsd, f xs, f ys)

        for(i=mini;i<total;i++) {
                char *temp;
                temp=malloc(512);
                if(i==selected) {
                        //bfont_printf(guitxrtmp + y*512+(x-24), 512, "[ %s ]", game_desc[i]);
                        sprintf(temp,"[ %s ]",game_desc[i]);
                        draw_string_center(y, 6.0f, 1.0f, 0.0f, 0.0f, 0.0f, temp, 1.5f, 1.5f);
                } else {
                        //bfont_printf(guitxrtmp + y*512+x, 512, game_desc[i]);
                        strcpy(temp,game_desc[i]);
                        draw_string_center(y, 6.0f, 1.0f, 0.0f, 0.0f, 0.0f, temp, 1.5f, 1.5f);
                }
                y += 27;
                free(temp);
        }
    ta_commit_poly_hdr(&poly);

    ta_commit_eol();
    ta_finish_frame();
        return 0;
}

void bfont_printf(uint16 *buffer, int width, char *fmt, ...) {
	va_list		args;
	char		pbuf[2048];

	va_start(args, fmt);
	vsprintf(pbuf, fmt, args);
	va_end(args);

        bfont_draw_str(buffer, width, 0, pbuf);
}

char return_hex_char_32 (uint32 val);
uint32 return_1_byte (uint32 val, int position);

void dc_print (char *fmt, ...) {
	va_list		args;
	char		pbuf[2048];
        poly_hdr_t poly;
	va_start(args, fmt);
	vsprintf(pbuf, fmt, args);
	va_end(args);
        ta_poly_hdr_col(&poly, TA_TRANSLUCENT);
        ta_begin_render();
        draw_background();
        ta_commit_eol();
        draw_string(20, 400, 6.0f, 1.0f, 0.0f, 0.0f, 0.0f, pbuf, 1.5f, 1.5f);
        printf("%s\r\n",pbuf);
        //bfont_draw_str(uitxrtmp + 400*640+20, 640, 0, pbuf);
        ta_commit_poly_hdr(&poly);
        ta_commit_eol();
        ta_finish_frame();
}

void dc_sleep (uint32 time) {
        thd_sleep(time);
}

void print_uint32 (uint32 val) {
	uint32 temp, temp2;
	char val_32[9];
        int i;
        poly_hdr_t poly;

        ta_poly_hdr_col(&poly, TA_TRANSLUCENT);
        ta_begin_render();
        draw_background();
        ta_commit_eol();
        //bfont_draw_str(uitxrtmp + 400*640+20, 640, 0, pbuf);
        for (i=0; i < 8; i++) {
		temp2 = val;
		temp = return_1_byte (temp2, i);
		val_32[7-i] = return_hex_char_32 (temp); 
	}
	val_32[8] = '\0';
        //draw_string (20, 20, 255, val_32);
        draw_string(20, 400, 6.0f, 1.0f, 0.0f, 0.0f, 0.0f, val_32, 1.5f, 1.5f);
        printf("%s\r\n",val_32);
        ta_commit_poly_hdr(&poly);
        ta_commit_eol();
        ta_finish_frame();
        thd_sleep(3000);
}


/* csleep(int sleep, uint16 pbutton);  okay, now I hated that i
 * couldnt flash a message with it sleeping for 500ms, in that 500ms
 * sleep someone may have pushed a button or something, so what this
 * baby does is sleeps for 1ms and after each 1ms it searches for the
 * controller, and then sleeps for 1ms again, until the designated
 * sleep number is done then it breaks out and returns 0, or if the
 * button is pressed then it breaks out of the loop and returns 1
 */
int csleep(int slp, uint16 pbutton) {
   int s=1,a=0;
   cont_cond_t mcond;

   while(1) {
          s++;
          if(cont_get_cond(maple_first_controller(), &mcond)) {
             return 0;
          }
          if(!(mcond.buttons  & pbutton)) {
             a=1;
             break;
          }
          thd_sleep(1);
          if(s==slp) {
             a=0;
             break;
          }
   }
   return(a);
   return(0);
}

int switch_mode(int res) {
        vid_set_mode_and_cable(vid_check_cable(), res, PM_RGB565);
        switch(res) {
                case DM_320x240:
                        SCREEN_W = 320;
                        SCREEN_H = 240;
                        break;
                case DM_640x480:
                        SCREEN_W = 640;
                        SCREEN_H = 480;
                        break;
                case DM_800x608:
                        SCREEN_W = 800;
                        SCREEN_H = 608;
                        break;
        }
        vid_clear(0,0,0);
        return(0);
}

void vmu_display(char * vmuimg) {
        uint8 vmubitmap[48*32/8];
        int x, y, xi, xb;
        memset(vmubitmap, 0, 48*32/8);
	for (y=0; y<32; y++)
		for (x=0; x<48; x++) {
			xi = x / 8;
			xb = 0x80 >> (x % 8);
                        if (vmuimg[(31-y)*48+(47-x)] == '.')
                                vmubitmap[y*(48/8)+xi] |= xb;
		}
	
        vmu_draw_lcd(maple_first_vmu(), vmubitmap);

⌨️ 快捷键说明

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