Files
Espresso/kernel/intro.c
2025-10-20 21:57:30 -05:00

117 lines
1.8 KiB
C

#include <string.h>
#include <tty.h>
#include <stdio.h>
#include <stdlib.h>
#include <drivers/ps2_keyboard.h>
#include <kernel/intro.h>
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;
}