#include #include #include #include #include #include void ack_char(char c); void start_kernel_shell(void); char char_entered = 0x00; void intro_begin(void) { extern char* kernel_version; char* fin = (char*) malloc(strlen(kernel_version) + 6); memset(fin, 0, (strlen(kernel_version) + 5)); strcpy(fin, kernel_version); #ifdef _DEBUG strcat(fin, " DEBUG"); #endif begin_anim(fin); } int16_t begin_anim(const char* version) { if (strlen(version) < 5) { return -1; } const char* e = "Espresso"; const char* v = version; const char* n = "Press any key to continue"; int32_t pos = 0; int32_t v_pos = 0; int16_t b = 0; int32_t sh_pos = VGA_WIDTH / 2; int32_t sv_pos = VGA_HEIGHT / 2; setup_hook((ps2_hook_t) ack_char); while (true) { terminal_clear(); if (char_entered != 0) { break; } for (int32_t i = 0; n[i]; ++i) { terminal_putentryat(n[i], terminal_getcolor(), sh_pos, sv_pos); sh_pos++; } for (int32_t i = 0; e[i]; ++i) { terminal_putentryat(e[i], terminal_getcolor(), pos + i, v_pos); } if ((v_pos + 1) == VGA_HEIGHT) { v_pos = 0; b = 1; } for (int32_t i = 0; v[i]; ++i) { terminal_putentryat(v[i], terminal_getcolor(), pos + i + 3, (b == 0 ? (v_pos + 1) : v_pos)); } pos += 2; v_pos++; sh_pos = VGA_WIDTH / 2; b = 0; sleep(1000); } if (char_entered != 0) { start_kernel_shell(); } else { terminal_clear(); } return 0; } void ack_char(char c) { char_entered = c; return; } void start_kernel_shell(void) { /* terminal_clear() already called by begin_anim() */ extern int kshell_start(int argc, char** argv); kshell_start(0, NULL); return; }