Skip to content

Commit eb0a7cf

Browse files
committed
optimizations, cleaning code and fix ports bug
1 parent 84d17ac commit eb0a7cf

File tree

8 files changed

+53
-59
lines changed

8 files changed

+53
-59
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 84d17ac56b97d198ca97cf389da05a5b12edecce
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Fri Aug 22 05:25:51 2025 +0700
4+
5+
improve makefile; fix bugs, add stdio.h and kprintf functions
6+
17
commit 26761cb02644a04ecd0efca37af1b761e43a7782
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Fri Aug 22 00:13:47 2025 +0700

src/bootloader/bootsector.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ load_kernel:
3737
; Устанавливаем параметры для функции disk_load:
3838
mov bx, KERNEL_OFFSET ; Загрузим данные в место памяти
3939
; смещению KERNEL_OFFSET
40-
mov dh, 32 ; Загрузим много секторов. *
40+
mov dh, 54 ; Загрузим много секторов для ядра.
4141
mov dl, [BOOT_DRIVE] ; Загрузим данные из BOOT_DRIVE (Возвращаем BOOT_DRIVE)
4242
call disk_load ; Вызываем функцию disk_load
4343
ret

src/kernel/cpu/isr.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
#include "../drivers/keyboard.h"
55
#include "../libc/string.h"
66
#include "timer.h"
7-
#include "ports.h"
7+
#include "../drivers/lowlevel_io.h"
88

99
isr_t interrupt_handlers[256];
1010

11-
/* Мы не можем сделать это с помощью цикла, потому
11+
/* Мы не можем сделать это с помощью цикла, потому
1212
* что нам нужен адрес имен функций */
1313
void isr_install() {
1414
set_idt_gate(0, (u32)isr0);
@@ -54,7 +54,7 @@ void isr_install() {
5454
port_byte_out(0x21, 0x01);
5555
port_byte_out(0xA1, 0x01);
5656
port_byte_out(0x21, 0x0);
57-
port_byte_out(0xA1, 0x0);
57+
port_byte_out(0xA1, 0x0);
5858

5959
// Установка IRQ
6060
set_idt_gate(32, (u32)irq0);
@@ -131,7 +131,7 @@ void register_interrupt_handler(u8 n, isr_t handler) {
131131
}
132132

133133
void irq_handler(registers_t r) {
134-
/* После каждого прерывания нам нужно отправлять EOI на PICs,
134+
/* После каждого прерывания нам нужно отправлять EOI на PICs,
135135
* иначе они больше не отправят другое прерывание */
136136
if (r.int_no >= 40) port_byte_out(0xA0, 0x20); /* slave */
137137
port_byte_out(0x20, 0x20); /* master */

src/kernel/cpu/timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "timer.h"
22
#include "isr.h"
3-
#include "ports.h"
3+
#include "../drivers/lowlevel_io.h"
44
#include "../libc/function.h"
55

66
u32 tick = 0;

src/kernel/drivers/lowlevel_io.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
* придется использовать inline assembly.
3030
* ----------------------------------------------------------------------------*/
3131

32-
3332
unsigned char port_byte_in(unsigned short port)
3433
{
3534
/* Функция-обертка над assembly, читающая 1 байт из параметра port */

src/kernel/drivers/screen.c

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "screen.h"
1313
#include "../cpu/ports.h"
1414
#include "../libc/mem.h"
15+
#include "lowlevel_io.h"
1516
#include "../libc/string.h"
1617

1718
/* Декларирования частных функций */
@@ -31,6 +32,30 @@ int get_offset_col(int offset);
3132
* Если col, row отрицательные, то используем текущий оффсет
3233
*/
3334
void kprint_at(char *message, int col, int row, int color) {
35+
struct { int clrcode; int color; } colors[] = {
36+
{.clrcode=WHITE_ON_BLACK_CLR_CODE, .color=WHITE_ON_BLACK},
37+
{.clrcode=BLUE_ON_BLACK_CLR_CODE, .color=BLUE_ON_BLACK},
38+
{.clrcode=GREEN_ON_BLACK_CLR_CODE, .color=GREEN_ON_BLACK},
39+
{.clrcode=CYAN_ON_BLACK_CLR_CODE, .color=CYAN_ON_BLACK},
40+
{.clrcode=RED_ON_BLACK_CLR_CODE, .color=RED_ON_BLACK},
41+
{.clrcode=MAGENTA_ON_BLACK_CLR_CODE, .color=MAGENTA_ON_BLACK},
42+
{.clrcode=BROWN_ON_BLACK_CLR_CODE, .color=BROWN_ON_BLACK},
43+
{.clrcode=LGREY_ON_BLACK_CLR_CODE, .color=LGREY_ON_BLACK},
44+
{.clrcode=DGREY_ON_BLACK_CLR_CODE, .color=DGREY_ON_BLACK},
45+
{.clrcode=LBLUE_ON_BLACK_CLR_CODE, .color=LBLUE_ON_BLACK},
46+
{.clrcode=LGREEN_ON_BLACK_CLR_CODE, .color=LGREEN_ON_BLACK},
47+
{.clrcode=LCYAN_ON_BLACK_CLR_CODE, .color=LCYAN_ON_BLACK},
48+
{.clrcode=LRED_ON_BLACK_CLR_CODE, .color=LRED_ON_BLACK},
49+
{.clrcode=LMAGENTA_ON_BLACK_CLR_CODE, .color=LMAGENTA_ON_BLACK},
50+
{.clrcode=YELLOW_ON_BLACK_CLR_CODE, .color=YELLOW_ON_BLACK},
51+
{.clrcode=WHITE_ON_BLUE_CLR_CODE, .color=WHITE_ON_BLUE},
52+
{.clrcode=WHITE_ON_RED_CLR_CODE, .color=WHITE_ON_RED},
53+
{.clrcode=RED_ON_WHITE_CLR_CODE, .color=RED_ON_WHITE},
54+
{.clrcode=BLUE_ON_WHITE_CLR_CODE, .color=BLUE_ON_WHITE},
55+
};
56+
57+
const int colors_length = sizeof(colors) / sizeof(colors[0]);
58+
3459
/* Установка курсора и оффсета если если col, row отрицательные */
3560
int offset;
3661
if (col >= 0 && row >= 0)
@@ -43,44 +68,12 @@ void kprint_at(char *message, int col, int row, int color) {
4368
/* "Прокрутка" сообщения и его вывод */
4469
int i = 0;
4570
while (message[i] != 0) {
46-
if (color == WHITE_ON_BLACK_CLR_CODE) {
47-
offset = print_char(message[i++], col, row, WHITE_ON_BLACK);
48-
} else if (color == BLUE_ON_BLACK_CLR_CODE) {
49-
offset = print_char(message[i++], col, row, BLUE_ON_BLACK);
50-
} else if (color == GREEN_ON_BLACK_CLR_CODE) {
51-
offset = print_char(message[i++], col, row, GREEN_ON_BLACK);
52-
} else if (color == CYAN_ON_BLACK_CLR_CODE) {
53-
offset = print_char(message[i++], col, row, CYAN_ON_BLACK);
54-
} else if (color == RED_ON_BLACK_CLR_CODE) {
55-
offset = print_char(message[i++], col, row, RED_ON_BLACK);
56-
} else if (color == MAGENTA_ON_BLACK_CLR_CODE) {
57-
offset = print_char(message[i++], col, row, MAGENTA_ON_BLACK);
58-
} else if (color == BROWN_ON_BLACK_CLR_CODE) {
59-
offset = print_char(message[i++], col, row, BROWN_ON_BLACK);
60-
} else if (color == LGREY_ON_BLACK_CLR_CODE) {
61-
offset = print_char(message[i++], col, row, LGREY_ON_BLACK);
62-
} else if (color == DGREY_ON_BLACK_CLR_CODE) {
63-
offset = print_char(message[i++], col, row, DGREY_ON_BLACK);
64-
} else if (color == LBLUE_ON_BLACK_CLR_CODE) {
65-
offset = print_char(message[i++], col, row, LBLUE_ON_BLACK);
66-
} else if (color == LGREEN_ON_BLACK_CLR_CODE) {
67-
offset = print_char(message[i++], col, row, LGREEN_ON_BLACK);
68-
} else if (color == LCYAN_ON_BLACK_CLR_CODE) {
69-
offset = print_char(message[i++], col, row, LCYAN_ON_BLACK);
70-
} else if (color == LRED_ON_BLACK_CLR_CODE) {
71-
offset = print_char(message[i++], col, row, LRED_ON_BLACK);
72-
} else if (color == LMAGENTA_ON_BLACK_CLR_CODE) {
73-
offset = print_char(message[i++], col, row, LMAGENTA_ON_BLACK);
74-
} else if (color == YELLOW_ON_BLACK_CLR_CODE) {
75-
offset = print_char(message[i++], col, row, YELLOW_ON_BLACK);
76-
} else if (color == WHITE_ON_BLUE_CLR_CODE) {
77-
offset = print_char(message[i++], col, row, WHITE_ON_BLUE);
78-
} else if (color == WHITE_ON_RED_CLR_CODE) {
79-
offset = print_char(message[i++], col, row, WHITE_ON_RED);
80-
} else if (color == RED_ON_WHITE_CLR_CODE) {
81-
offset = print_char(message[i++], col, row, RED_ON_WHITE);
82-
} else if (color == BLUE_ON_WHITE_CLR_CODE) {
83-
offset = print_char(message[i++], col, row, BLUE_ON_WHITE);
71+
72+
for (int j = 0; j < colors_length; ++j) {
73+
if (color == colors[j].clrcode) {
74+
offset = print_char(message[i++], col, row, colors[j].color);
75+
break;
76+
}
8477
}
8578

8679
/* Вычисление row/col для следующей итерации */

src/kernel/kernel/utils.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,12 @@ void shutdown_qemu() {
1616
}
1717

1818
void halt_cpu() {
19-
kprint("Stopping the CPU. Bye! (recommended shutdown PC)\n");
2019
halted_cpu_screen_clear();
21-
kprint_colored("Kintsugi OS 0.1.0\n", BLUE_ON_WHITE_CLR_CODE);
22-
kprint_colored("HLT STOPPING CPU\n\n", BLUE_ON_WHITE_CLR_CODE);
23-
24-
kprint_colored("Kintsugi OS Kernel Blue Screen\n\n", WHITE_ON_BLUE_CLR_CODE);
25-
kprint_colored(" >>> Sended END: halting the CPU\n", WHITE_ON_BLUE_CLR_CODE);
26-
kprint_colored("HLT interrupt assmebly: error code 0x0000000000 (HLTCPU)\n", WHITE_ON_BLUE_CLR_CODE);
27-
kprint_colored("Recomended: shutdown PC\n\n", WHITE_ON_BLUE_CLR_CODE);
28-
kprint_colored("[WARNING] This message is normal. Just shutdown or reboot", WHITE_ON_BLUE_CLR_CODE);
20+
kprint_colored("Kintsugi OS 0.1.0\n\n", BLUE_ON_WHITE_CLR_CODE);
21+
kprint_colored("Halted CPU Blue Screen\n", BLUE_ON_WHITE_CLR_CODE);
22+
kprint_colored("CPU is halted.\n\n", BLUE_ON_WHITE_CLR_CODE);
23+
kprint_colored("asm volatile(\"hlt\")", BLUE_ON_WHITE_CLR_CODE);
24+
2925
asm volatile("hlt");
3026
}
3127

@@ -71,17 +67,17 @@ void test_mem_command() {
7167

7268
kprint("Allocated blocks:\n");
7369

74-
kprint("Ptr1: 0x");
70+
kprint("Ptr1: ");
7571
hex_to_ascii((int)ptr1, buf1);
7672
kprint(buf1);
7773
kprint("\n");
7874

79-
kprint("Ptr2: 0x");
75+
kprint("Ptr2: ");
8076
hex_to_ascii((int)ptr2, buf2);
8177
kprint(buf2);
8278
kprint("\n");
8379

84-
kprint("Ptr3: 0x");
80+
kprint("Ptr3: ");
8581
hex_to_ascii((int)ptr3, buf3);
8682
kprint(buf3);
8783
kprint("\n");

src/kernel/libc/mem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void heap_init() {
3535
free_blocks->next = NULL;
3636
free_blocks->is_free = 1;
3737

38-
kprint("Heap initialized at 0x");
38+
kprint("Heap initialized at ");
3939
char buf[32] = "";
4040
hex_to_ascii(HEAP_START, buf);
4141
kprint(buf);
@@ -114,7 +114,7 @@ void kmemdump() { // дамп памяти
114114
char buf[32];
115115
int_to_ascii(block_count++, buf);
116116
kprint(buf);
117-
kprint(": Addr=0x");
117+
kprint(": Addr=");
118118
hex_to_ascii((u32)current, buf);
119119
kprint(buf);
120120
kprint(", Size=");

0 commit comments

Comments
 (0)