mirror of
https://github.com/Leonmmcoset/cleonos.git
synced 2026-04-21 18:44:01 +00:00
Stage 18
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include <clks/framebuffer.h>
|
#include <clks/framebuffer.h>
|
||||||
|
#include <clks/string.h>
|
||||||
#include <clks/types.h>
|
#include <clks/types.h>
|
||||||
|
|
||||||
#include "psf_font.h"
|
#include "psf_font.h"
|
||||||
@@ -103,6 +104,45 @@ void clks_fb_clear(u32 rgb) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clks_fb_scroll_up(u32 pixel_rows, u32 fill_rgb) {
|
||||||
|
usize row_bytes;
|
||||||
|
usize move_bytes;
|
||||||
|
u32 y;
|
||||||
|
u32 x;
|
||||||
|
|
||||||
|
if (clks_fb.ready == CLKS_FALSE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clks_fb.info.bpp != 32) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixel_rows == 0U) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixel_rows >= clks_fb.info.height) {
|
||||||
|
clks_fb_clear(fill_rgb);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
row_bytes = (usize)clks_fb.info.pitch;
|
||||||
|
move_bytes = (usize)(clks_fb.info.height - pixel_rows) * row_bytes;
|
||||||
|
|
||||||
|
clks_memmove(
|
||||||
|
(void *)clks_fb.address,
|
||||||
|
(const void *)(clks_fb.address + ((usize)pixel_rows * row_bytes)),
|
||||||
|
move_bytes
|
||||||
|
);
|
||||||
|
|
||||||
|
for (y = clks_fb.info.height - pixel_rows; y < clks_fb.info.height; y++) {
|
||||||
|
for (x = 0U; x < clks_fb.info.width; x++) {
|
||||||
|
clks_fb_put_pixel(x, y, fill_rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void clks_fb_draw_char(u32 x, u32 y, char ch, u32 fg_rgb, u32 bg_rgb) {
|
void clks_fb_draw_char(u32 x, u32 y, char ch, u32 fg_rgb, u32 bg_rgb) {
|
||||||
const u8 *glyph;
|
const u8 *glyph;
|
||||||
u32 row;
|
u32 row;
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ void clks_fb_init(const struct limine_framebuffer *fb);
|
|||||||
clks_bool clks_fb_ready(void);
|
clks_bool clks_fb_ready(void);
|
||||||
struct clks_framebuffer_info clks_fb_info(void);
|
struct clks_framebuffer_info clks_fb_info(void);
|
||||||
void clks_fb_clear(u32 rgb);
|
void clks_fb_clear(u32 rgb);
|
||||||
|
void clks_fb_scroll_up(u32 pixel_rows, u32 fill_rgb);
|
||||||
void clks_fb_draw_char(u32 x, u32 y, char ch, u32 fg_rgb, u32 bg_rgb);
|
void clks_fb_draw_char(u32 x, u32 y, char ch, u32 fg_rgb, u32 bg_rgb);
|
||||||
clks_bool clks_fb_load_psf_font(const void *blob, u64 blob_size);
|
clks_bool clks_fb_load_psf_font(const void *blob, u64 blob_size);
|
||||||
u32 clks_fb_cell_width(void);
|
u32 clks_fb_cell_width(void);
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ void clks_kernel_main(void) {
|
|||||||
clks_tty_init();
|
clks_tty_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS STAGE16 START");
|
clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS STAGE18 START");
|
||||||
|
|
||||||
if (boot_fb == CLKS_NULL) {
|
if (boot_fb == CLKS_NULL) {
|
||||||
clks_log(CLKS_LOG_WARN, "VIDEO", "NO FRAMEBUFFER FROM LIMINE");
|
clks_log(CLKS_LOG_WARN, "VIDEO", "NO FRAMEBUFFER FROM LIMINE");
|
||||||
@@ -218,10 +218,12 @@ void clks_kernel_main(void) {
|
|||||||
clks_log_hex(CLKS_LOG_INFO, "SYSCALL", "TICKS", syscall_ticks);
|
clks_log_hex(CLKS_LOG_INFO, "SYSCALL", "TICKS", syscall_ticks);
|
||||||
|
|
||||||
clks_shell_init();
|
clks_shell_init();
|
||||||
|
clks_log(CLKS_LOG_INFO, "SHELL", "KERNEL SHELL ACTIVE");
|
||||||
|
|
||||||
clks_log_hex(CLKS_LOG_INFO, "TTY", "COUNT", (u64)clks_tty_count());
|
clks_log_hex(CLKS_LOG_INFO, "TTY", "COUNT", (u64)clks_tty_count());
|
||||||
clks_log_hex(CLKS_LOG_INFO, "TTY", "ACTIVE", (u64)clks_tty_active());
|
clks_log_hex(CLKS_LOG_INFO, "TTY", "ACTIVE", (u64)clks_tty_active());
|
||||||
clks_log(CLKS_LOG_INFO, "TTY", "VIRTUAL TTY0 READY");
|
clks_log(CLKS_LOG_INFO, "TTY", "VIRTUAL TTY0 READY");
|
||||||
|
clks_log(CLKS_LOG_INFO, "TTY", "CURSOR ENABLED");
|
||||||
clks_log(CLKS_LOG_DEBUG, "KERNEL", "IDLE LOOP ENTER");
|
clks_log(CLKS_LOG_DEBUG, "KERNEL", "IDLE LOOP ENTER");
|
||||||
|
|
||||||
clks_cpu_halt_forever();
|
clks_cpu_halt_forever();
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ static u32 clks_tty_active_index = 0;
|
|||||||
static u32 clks_tty_cell_width = 8U;
|
static u32 clks_tty_cell_width = 8U;
|
||||||
static u32 clks_tty_cell_height = 8U;
|
static u32 clks_tty_cell_height = 8U;
|
||||||
static clks_bool clks_tty_is_ready = CLKS_FALSE;
|
static clks_bool clks_tty_is_ready = CLKS_FALSE;
|
||||||
|
static clks_bool clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
|
|
||||||
static void clks_tty_fill_row(u32 tty_index, u32 row, char ch) {
|
static void clks_tty_fill_row(u32 tty_index, u32 row, char ch) {
|
||||||
u32 col;
|
u32 col;
|
||||||
@@ -29,8 +30,57 @@ static void clks_tty_fill_row(u32 tty_index, u32 row, char ch) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void clks_tty_draw_cell_with_colors(u32 row, u32 col, char ch, u32 fg, u32 bg) {
|
||||||
|
clks_fb_draw_char(col * clks_tty_cell_width, row * clks_tty_cell_height, ch, fg, bg);
|
||||||
|
}
|
||||||
|
|
||||||
static void clks_tty_draw_cell(u32 row, u32 col, char ch) {
|
static void clks_tty_draw_cell(u32 row, u32 col, char ch) {
|
||||||
clks_fb_draw_char(col * clks_tty_cell_width, row * clks_tty_cell_height, ch, CLKS_TTY_FG, CLKS_TTY_BG);
|
clks_tty_draw_cell_with_colors(row, col, ch, CLKS_TTY_FG, CLKS_TTY_BG);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clks_tty_hide_cursor(void) {
|
||||||
|
u32 row;
|
||||||
|
u32 col;
|
||||||
|
|
||||||
|
if (clks_tty_is_ready == CLKS_FALSE || clks_tty_cursor_visible == CLKS_FALSE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
row = clks_tty_cursor_row[clks_tty_active_index];
|
||||||
|
col = clks_tty_cursor_col[clks_tty_active_index];
|
||||||
|
|
||||||
|
if (row < clks_tty_rows && col < clks_tty_cols) {
|
||||||
|
clks_tty_draw_cell(row, col, clks_tty_cells[clks_tty_active_index][row][col]);
|
||||||
|
}
|
||||||
|
|
||||||
|
clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clks_tty_draw_cursor(void) {
|
||||||
|
u32 row;
|
||||||
|
u32 col;
|
||||||
|
|
||||||
|
if (clks_tty_is_ready == CLKS_FALSE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
row = clks_tty_cursor_row[clks_tty_active_index];
|
||||||
|
col = clks_tty_cursor_col[clks_tty_active_index];
|
||||||
|
|
||||||
|
if (row >= clks_tty_rows || col >= clks_tty_cols) {
|
||||||
|
clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clks_tty_draw_cell_with_colors(
|
||||||
|
row,
|
||||||
|
col,
|
||||||
|
clks_tty_cells[clks_tty_active_index][row][col],
|
||||||
|
CLKS_TTY_BG,
|
||||||
|
CLKS_TTY_FG
|
||||||
|
);
|
||||||
|
|
||||||
|
clks_tty_cursor_visible = CLKS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clks_tty_redraw_active(void) {
|
static void clks_tty_redraw_active(void) {
|
||||||
@@ -38,12 +88,15 @@ static void clks_tty_redraw_active(void) {
|
|||||||
u32 col;
|
u32 col;
|
||||||
|
|
||||||
clks_fb_clear(CLKS_TTY_BG);
|
clks_fb_clear(CLKS_TTY_BG);
|
||||||
|
clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
|
|
||||||
for (row = 0; row < clks_tty_rows; row++) {
|
for (row = 0; row < clks_tty_rows; row++) {
|
||||||
for (col = 0; col < clks_tty_cols; col++) {
|
for (col = 0; col < clks_tty_cols; col++) {
|
||||||
clks_tty_draw_cell(row, col, clks_tty_cells[clks_tty_active_index][row][col]);
|
clks_tty_draw_cell(row, col, clks_tty_cells[clks_tty_active_index][row][col]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clks_tty_draw_cursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clks_tty_scroll_up(u32 tty_index) {
|
static void clks_tty_scroll_up(u32 tty_index) {
|
||||||
@@ -60,7 +113,13 @@ static void clks_tty_scroll_up(u32 tty_index) {
|
|||||||
clks_tty_fill_row(tty_index, clks_tty_rows - 1, ' ');
|
clks_tty_fill_row(tty_index, clks_tty_rows - 1, ' ');
|
||||||
|
|
||||||
if (tty_index == clks_tty_active_index) {
|
if (tty_index == clks_tty_active_index) {
|
||||||
clks_tty_redraw_active();
|
u32 col;
|
||||||
|
|
||||||
|
clks_fb_scroll_up(clks_tty_cell_height, CLKS_TTY_BG);
|
||||||
|
|
||||||
|
for (col = 0U; col < clks_tty_cols; col++) {
|
||||||
|
clks_tty_draw_cell(clks_tty_rows - 1U, col, clks_tty_cells[tty_index][clks_tty_rows - 1U][col]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +180,7 @@ void clks_tty_init(void) {
|
|||||||
|
|
||||||
clks_tty_active_index = 0;
|
clks_tty_active_index = 0;
|
||||||
clks_tty_is_ready = CLKS_TRUE;
|
clks_tty_is_ready = CLKS_TRUE;
|
||||||
|
clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
clks_tty_redraw_active();
|
clks_tty_redraw_active();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,12 +193,15 @@ void clks_tty_write_char(char ch) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clks_tty_hide_cursor();
|
||||||
|
|
||||||
tty_index = clks_tty_active_index;
|
tty_index = clks_tty_active_index;
|
||||||
row = clks_tty_cursor_row[tty_index];
|
row = clks_tty_cursor_row[tty_index];
|
||||||
col = clks_tty_cursor_col[tty_index];
|
col = clks_tty_cursor_col[tty_index];
|
||||||
|
|
||||||
if (ch == '\r') {
|
if (ch == '\r') {
|
||||||
clks_tty_cursor_col[tty_index] = 0;
|
clks_tty_cursor_col[tty_index] = 0;
|
||||||
|
clks_tty_draw_cursor();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,11 +214,13 @@ void clks_tty_write_char(char ch) {
|
|||||||
clks_tty_cursor_row[tty_index] = clks_tty_rows - 1;
|
clks_tty_cursor_row[tty_index] = clks_tty_rows - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clks_tty_draw_cursor();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch == '\b') {
|
if (ch == '\b') {
|
||||||
if (col == 0U && row == 0U) {
|
if (col == 0U && row == 0U) {
|
||||||
|
clks_tty_draw_cursor();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +234,7 @@ void clks_tty_write_char(char ch) {
|
|||||||
clks_tty_put_visible(tty_index, row, col, ' ');
|
clks_tty_put_visible(tty_index, row, col, ' ');
|
||||||
clks_tty_cursor_row[tty_index] = row;
|
clks_tty_cursor_row[tty_index] = row;
|
||||||
clks_tty_cursor_col[tty_index] = col;
|
clks_tty_cursor_col[tty_index] = col;
|
||||||
|
clks_tty_draw_cursor();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,6 +258,8 @@ void clks_tty_write_char(char ch) {
|
|||||||
clks_tty_cursor_row[tty_index] = clks_tty_rows - 1;
|
clks_tty_cursor_row[tty_index] = clks_tty_rows - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clks_tty_draw_cursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clks_tty_write(const char *text) {
|
void clks_tty_write(const char *text) {
|
||||||
@@ -216,13 +284,16 @@ void clks_tty_switch(u32 tty_index) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clks_tty_hide_cursor();
|
||||||
clks_tty_active_index = tty_index;
|
clks_tty_active_index = tty_index;
|
||||||
|
clks_tty_cursor_visible = CLKS_FALSE;
|
||||||
clks_tty_redraw_active();
|
clks_tty_redraw_active();
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 clks_tty_active(void) {
|
u32 clks_tty_active(void) {
|
||||||
return clks_tty_active_index;
|
return clks_tty_active_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 clks_tty_count(void) {
|
u32 clks_tty_count(void) {
|
||||||
return CLKS_TTY_COUNT;
|
return CLKS_TTY_COUNT;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
static clks_bool clks_user_shell_ready = CLKS_FALSE;
|
static clks_bool clks_user_shell_ready = CLKS_FALSE;
|
||||||
static clks_bool clks_user_shell_exec_requested_flag = CLKS_FALSE;
|
static clks_bool clks_user_shell_exec_requested_flag = CLKS_FALSE;
|
||||||
|
static clks_bool clks_user_shell_exec_enabled = CLKS_FALSE;
|
||||||
static u64 clks_user_launch_attempt_count = 0ULL;
|
static u64 clks_user_launch_attempt_count = 0ULL;
|
||||||
static u64 clks_user_launch_success_count = 0ULL;
|
static u64 clks_user_launch_success_count = 0ULL;
|
||||||
static u64 clks_user_launch_fail_count = 0ULL;
|
static u64 clks_user_launch_fail_count = 0ULL;
|
||||||
@@ -82,6 +83,7 @@ clks_bool clks_userland_init(void) {
|
|||||||
|
|
||||||
clks_user_shell_ready = CLKS_FALSE;
|
clks_user_shell_ready = CLKS_FALSE;
|
||||||
clks_user_shell_exec_requested_flag = CLKS_FALSE;
|
clks_user_shell_exec_requested_flag = CLKS_FALSE;
|
||||||
|
clks_user_shell_exec_enabled = CLKS_FALSE;
|
||||||
clks_user_launch_attempt_count = 0ULL;
|
clks_user_launch_attempt_count = 0ULL;
|
||||||
clks_user_launch_success_count = 0ULL;
|
clks_user_launch_success_count = 0ULL;
|
||||||
clks_user_launch_fail_count = 0ULL;
|
clks_user_launch_fail_count = 0ULL;
|
||||||
@@ -103,12 +105,14 @@ clks_bool clks_userland_init(void) {
|
|||||||
return CLKS_FALSE;
|
return CLKS_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void)clks_userland_request_shell_exec();
|
clks_log(CLKS_LOG_INFO, "USER", "USER SHELL EXEC DISABLED (KERNEL SHELL MODE)");
|
||||||
return CLKS_TRUE;
|
return CLKS_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clks_userland_tick(u64 tick) {
|
void clks_userland_tick(u64 tick) {
|
||||||
if (clks_user_shell_ready == CLKS_FALSE || clks_user_shell_exec_requested_flag == CLKS_TRUE) {
|
if (clks_user_shell_exec_enabled == CLKS_FALSE ||
|
||||||
|
clks_user_shell_ready == CLKS_FALSE ||
|
||||||
|
clks_user_shell_exec_requested_flag == CLKS_TRUE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
84
scripts/gen-tty-psf.ps1
Normal file
84
scripts/gen-tty-psf.ps1
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
param(
|
||||||
|
[string]$OutputPath = "ramdisk/system/tty.psf"
|
||||||
|
)
|
||||||
|
|
||||||
|
Add-Type -AssemblyName System.Drawing
|
||||||
|
|
||||||
|
$width = 8
|
||||||
|
$height = 16
|
||||||
|
$glyphCount = 256
|
||||||
|
$headerSize = 4
|
||||||
|
$bytesPerGlyph = $height
|
||||||
|
$totalSize = $headerSize + ($glyphCount * $bytesPerGlyph)
|
||||||
|
|
||||||
|
$fontCandidates = @("Consolas", "Lucida Console", "Courier New")
|
||||||
|
$font = $null
|
||||||
|
foreach ($name in $fontCandidates) {
|
||||||
|
try {
|
||||||
|
$font = New-Object System.Drawing.Font($name, 14, [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Pixel)
|
||||||
|
if ($font.Name -eq $name) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
$font = $null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($null -eq $font) {
|
||||||
|
throw "No usable monospace font found for PSF generation"
|
||||||
|
}
|
||||||
|
|
||||||
|
$bytes = New-Object byte[] $totalSize
|
||||||
|
$bytes[0] = 0x36
|
||||||
|
$bytes[1] = 0x04
|
||||||
|
$bytes[2] = 0x00
|
||||||
|
$bytes[3] = [byte]$bytesPerGlyph
|
||||||
|
|
||||||
|
# default all glyphs to blank, avoids noisy '?' for undefined chars.
|
||||||
|
for ($i = $headerSize; $i -lt $totalSize; $i++) {
|
||||||
|
$bytes[$i] = 0x00
|
||||||
|
}
|
||||||
|
|
||||||
|
$white = [System.Drawing.Brushes]::White
|
||||||
|
$black = [System.Drawing.Color]::Black
|
||||||
|
|
||||||
|
for ($code = 32; $code -le 126; $code++) {
|
||||||
|
$ch = [char]$code
|
||||||
|
|
||||||
|
$bmp = New-Object System.Drawing.Bitmap $width, $height
|
||||||
|
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||||
|
$g.Clear($black)
|
||||||
|
$g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::SingleBitPerPixelGridFit
|
||||||
|
|
||||||
|
# Small negative offset keeps glyph centered in 8x16 cell for common monospace fonts.
|
||||||
|
$g.DrawString([string]$ch, $font, $white, -1, -2)
|
||||||
|
|
||||||
|
$glyphOffset = $headerSize + ($code * $bytesPerGlyph)
|
||||||
|
|
||||||
|
for ($y = 0; $y -lt $height; $y++) {
|
||||||
|
[byte]$rowBits = 0
|
||||||
|
|
||||||
|
for ($x = 0; $x -lt $width; $x++) {
|
||||||
|
$p = $bmp.GetPixel($x, $y)
|
||||||
|
if (($p.R + $p.G + $p.B) -ge 384) {
|
||||||
|
$rowBits = [byte]($rowBits -bor (1 -shl (7 - $x)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$bytes[$glyphOffset + $y] = $rowBits
|
||||||
|
}
|
||||||
|
|
||||||
|
$g.Dispose()
|
||||||
|
$bmp.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
$font.Dispose()
|
||||||
|
|
||||||
|
$dir = Split-Path -Parent $OutputPath
|
||||||
|
if (-not [string]::IsNullOrWhiteSpace($dir)) {
|
||||||
|
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
$fullOutput = Join-Path (Resolve-Path '.') $OutputPath
|
||||||
|
[System.IO.File]::WriteAllBytes($fullOutput, $bytes)
|
||||||
|
Write-Output "Generated $OutputPath ($($bytes.Length) bytes)"
|
||||||
Reference in New Issue
Block a user