aboutsummaryrefslogtreecommitdiff
path: root/mirai/kernel/entry.zig
blob: 7d9c9f660660122f0c188e2bfd392431c8d4174c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//! Kernel Entry

const boot = @import("boot.zig");
const asm_ops = @import("../asm/asm.zig");

pub const BootParams = boot.BootParams;

pub fn main(boot_params_ptr: *boot.BootParams) noreturn {
    if (!boot_params_ptr.is_valid()) {
        if (boot_params_ptr.framebuffer.base != 0) {
            draw_error_screen(boot_params_ptr);
        }
        asm_ops.cpu.halt.halt_loop();
    }

    draw_boot_screen(boot_params_ptr);
    asm_ops.cpu.halt.halt_loop();
}

fn draw_boot_screen(params: *boot.BootParams) void {
    const fb = params.framebuffer;
    const base: [*]u32 = @ptrFromInt(fb.base);
    const stride = fb.stride;

    const bg_color: u32 = switch (fb.pixel_format) {
        .rgb => 0x1E0030,
        .bgr => 0x30001E,
        else => 0x1E0030,
    };

    var row: u32 = 0;
    while (row < fb.height) : (row += 1) {
        var col: u32 = 0;
        while (col < fb.width) : (col += 1) {
            base[row * stride + col] = bg_color;
        }
    }

    const text_color: u32 = switch (fb.pixel_format) {
        .rgb => 0x00FFFF,
        .bgr => 0xFFFF00,
        else => 0x00FFFF,
    };

    const banner = [_][]const u8{
        "   A   K  K  III  BBB    A   ",
        "  A A  K K    I   B  B  A A  ",
        " AAAAA KK     I   BBB  AAAAA ",
        " A   A K K    I   B  B A   A ",
        " A   A K  K  III  BBB  A   A ",
    };

    const start_x = (fb.width - 29 * 8) / 2;
    const start_y = fb.height / 3;

    for (banner, 0..) |line, line_row| {
        for (line, 0..) |char, line_col| {
            if (char != ' ') {
                draw_block(base, stride, start_x + @as(u32, @truncate(line_col)) * 8, start_y + @as(u32, @truncate(line_row)) * 12, text_color);
            }
        }
    }

    const subtitle = "AkibaOS Kernel Loaded Successfully";
    const subtitle_x = (fb.width - @as(u32, @truncate(subtitle.len)) * 8) / 2;
    const subtitle_y = start_y + 80;

    for (0..subtitle.len) |idx| {
        draw_small_block(base, stride, subtitle_x + @as(u32, @truncate(idx)) * 8, subtitle_y, 0xFF80C0);
    }
}

fn draw_error_screen(params: *boot.BootParams) void {
    const fb = params.framebuffer;
    const base: [*]u32 = @ptrFromInt(fb.base);
    const stride = fb.stride;

    const error_color: u32 = switch (fb.pixel_format) {
        .rgb => 0xFF0000,
        .bgr => 0x0000FF,
        else => 0xFF0000,
    };

    var row: u32 = 0;
    while (row < fb.height) : (row += 1) {
        var col: u32 = 0;
        while (col < fb.width) : (col += 1) {
            base[row * stride + col] = error_color;
        }
    }
}

fn draw_block(base: [*]u32, stride: u32, x_pos: u32, y_pos: u32, color: u32) void {
    var dy: u32 = 0;
    while (dy < 10) : (dy += 1) {
        var dx: u32 = 0;
        while (dx < 6) : (dx += 1) {
            base[(y_pos + dy) * stride + x_pos + dx] = color;
        }
    }
}

fn draw_small_block(base: [*]u32, stride: u32, x_pos: u32, y_pos: u32, color: u32) void {
    var dy: u32 = 0;
    while (dy < 2) : (dy += 1) {
        var dx: u32 = 0;
        while (dx < 6) : (dx += 1) {
            base[(y_pos + dy) * stride + x_pos + dx] = color;
        }
    }
}