#if defined(GEKKO) #include "lexer.hpp" #include "parser.hpp" #include #include #include #include #include #include #if defined(HW_RVL) #include #endif #include static void *xfb = NULL; static GXRModeObj *rmode = NULL; BoxScript::ListNode* _root_node; void clear_screen_ogc() { VIDEO_ClearFrameBuffer(rmode,xfb,0); } int appstate=0; std::string read_file(std::string name) { FILE* f=fopen(name.c_str(),"r"); std::string text=""; while(true) { int read = fgetc(f); if(read == EOF) break; text += (char)read; } fclose(f); return text; } bool DirExists(std::string path) { DIR* dir; bool exists = false; dir = opendir(path.c_str()); if(dir != NULL) { exists=true; (void)closedir(dir); } return exists; } void LoadSubscripts(BoxScript::ListNode* nodes,std::string path) { std::vector files = get_files(path); for(std::string file : files) { std::string newPath = path + "/" + file; std::vector tokens=BoxScript::Lexer::Lex(read_file(newPath)); BoxScript::Parse(nodes,tokens); } } void PrintElement(std::string text,bool checked) { printf("\t[%c] %s\n",checked ? '*' : ' ', text.c_str()); } void LoadScript(BoxScript::ListNode* nodes) { if(!DirExists("/BoxScript")) { mkdir("/BoxScript",0755); } if(DirExists("/BoxScript/Autoboot")) { if(DirExists("/BoxScript/Autoboot/deps")) LoadSubscripts(nodes,"/BoxScript/Autoboot/deps"); std::vector tokens=BoxScript::Lexer::Lex(read_file("/BoxScript/Autoboot/app.bs")); BoxScript::Parse(nodes,tokens); }else{ std::vector dirs= get_directories("/BoxScript"); int item=0; while(appstate != -1) { #if defined(HW_RVL) WPAD_ScanPads(); #endif PAD_ScanPads(); if(PAD_ButtonsDown(0) & PAD_BUTTON_UP) { item--; if(item < 0) { item = dirs.size()-1; } } if(PAD_ButtonsDown(0) & PAD_BUTTON_DOWN) { item++; if(item >= dirs.size()) { item=0; } } if(PAD_ButtonsDown(0) & PAD_BUTTON_A) { break; } #if defined(HW_RVL) if(WPAD_ButtonsDown(0) & WPAD_BUTTON_UP) { item--; if(item < 0) { item = dirs.size()-1; } } if(WPAD_ButtonsDown(0) & WPAD_BUTTON_DOWN) { item++; if(item >= dirs.size()) { item=0; } } if(WPAD_ButtonsDown(0) & WPAD_BUTTON_A) { break; } #endif clear_screen_ogc(); printf("\x1b[2;2H"); printf("\n\n"); printf("\tBoxScript 1.0 Wii Version\n"); int indexOnScreen = item % 14; int screenOffset = (item - indexOnScreen); int i=0; for(i = 0;i<14;i++) { if(screenOffset + i < dirs.size()) PrintElement(dirs[i+screenOffset],i == indexOnScreen); } //printf("\tNo Items: %i",i); VIDEO_WaitVSync(); } if(appstate == -1) exit(0); if(DirExists("/BoxScript/" + dirs[item])) LoadSubscripts(nodes,"/BoxScript/" + dirs[item] + "/deps"); std::vector tokens=BoxScript::Lexer::Lex(read_file("/BoxScript/" + dirs[item] + "/app.bs")); BoxScript::Parse(nodes,tokens); } } BoxScript::ApplicationState* state; void WiiResetPressed(unsigned int a,void* ptr) { if(appstate <= 0) { appstate= -1; }else{ state->StopRunning(); } } //--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- BoxScript::NetworkInit(); fatInitDefault(); SYS_SetResetCallback(WiiResetPressed); // Initialise the video system VIDEO_Init(); PAD_Init(); #if defined(HW_RVL) WPAD_Init(); #endif // This function initialises the attached controllers // Obtain the preferred video mode from the system // This will correspond to the settings in the Wii menu rmode = VIDEO_GetPreferredMode(NULL); // Allocate memory for the display in the uncached region xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); // Initialise the console, required for printf console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ); // Set up the video registers with the chosen mode VIDEO_Configure(rmode); // Tell the video hardware where our display memory is VIDEO_SetNextFramebuffer(xfb); // Make the display visible VIDEO_SetBlack(FALSE); // Flush the video register changes to the hardware VIDEO_Flush(); // Wait for Video setup to complete VIDEO_WaitVSync(); if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync(); // The console understands VT terminal escape codes // This positions the cursor on row 2, column 0 // we can use variables for this with format codes too // e.g. printf ("\x1b[%d;%dH", row, column ); printf("\x1b[2;2H"); _root_node = new BoxScript::ListNode(); LoadScript(_root_node); appstate=1; state=new BoxScript::ApplicationState(); RegisterMainRuntimeFunctions(state); _root_node->Evaluate(state); DestroyApp(0); } void DestroyApp(int a) { delete _root_node; exit(a); } #endif