@@ -114,6 +114,36 @@ void kprint_backspace() {
114114 set_cursor_offset (offset );
115115}
116116
117+ void halted_cpu_screen_clear () {
118+ int screen_size = MAX_COLS * MAX_ROWS ;
119+ int i ;
120+ u8 * screen = (u8 * ) VIDEO_ADDRESS ;
121+
122+ for (i = 0 ; i < screen_size ; i ++ ) {
123+ screen [i * 2 ] = ' ' ;
124+ screen [i * 2 + 1 ] = WHITE_ON_BLUE ;
125+ }
126+ set_cursor_offset (get_offset (0 , 0 ));
127+ }
128+
129+ void panic_red_screen (char * title , char * description ) {
130+ int screen_size = MAX_COLS * MAX_ROWS ;
131+ u8 * screen = (u8 * )VIDEO_ADDRESS ;
132+
133+ for (int i = 0 ; i < screen_size ; ++ i ) {
134+ screen [i * 2 ] = ' ' ;
135+ screen [i * 2 + 1 ] = WHITE_ON_RED ;
136+ }
137+
138+ set_cursor_offset (get_offset (0 , 0 ));
139+
140+ kprint_colored ("KINTSUGIOS KERNEL PANIC RED SCREEN\n\n" , WHITE_ON_RED_CLR_CODE );
141+ kprint_colored (title , WHITE_ON_RED_CLR_CODE );
142+ kprint_colored ("\n\n" , WHITE_ON_RED_CLR_CODE );
143+ kprint_colored (description , WHITE_ON_RED_CLR_CODE );
144+
145+ asm volatile ("hlt" );
146+ }
117147
118148/**********************************************************
119149 * Приватные функции ядра *
@@ -174,18 +204,6 @@ int print_char(char c, int col, int row, char attr) {
174204 return offset ;
175205}
176206
177- void halted_cpu_screen_clear () {
178- int screen_size = MAX_COLS * MAX_ROWS ;
179- int i ;
180- u8 * screen = (u8 * ) VIDEO_ADDRESS ;
181-
182- for (i = 0 ; i < screen_size ; i ++ ) {
183- screen [i * 2 ] = ' ' ;
184- screen [i * 2 + 1 ] = WHITE_ON_BLUE ;
185- }
186- set_cursor_offset (get_offset (0 , 0 ));
187- }
188-
189207int get_cursor_offset () {
190208 /* Используем VGA порты для получения текущей позиции курсора
191209 * 1. (data 14) Получаем высший байт оффсета курсора
@@ -222,131 +240,3 @@ void clear_screen() {
222240int get_offset (int col , int row ) { return 2 * (row * MAX_COLS + col ); }
223241int get_offset_row (int offset ) { return offset / (2 * MAX_COLS ); }
224242int get_offset_col (int offset ) { return (offset - (get_offset_row (offset )* 2 * MAX_COLS ))/2 ; }
225-
226-
227- // Старый код
228- // #include "screen.h"
229- // #include "lowlevel_io.h"
230- // #include "../common.h"
231- //
232- // void kprint(u8 *str)
233- // {
234- // /* Функция печати строки */
235- //
236- // // u8 *str: указатель на строку (на первый символ строки). Строка должна
237- // // быть null-terminated.
238- //
239- // while (*str)
240- // {
241- // putchar(*str, WHITE_ON_BLACK);
242- // str++;
243- // }
244- // }
245- //
246- // void putchar(u8 character, u8 attribute_byte)
247- // {
248- // /* Более высокоуровневая функция печати символа */
249- //
250- // // u8 character: байт, соответствующий символу
251- // // u8 attribute_byte: байт, соответствующий цвету текста/фона символа
252- //
253- // u16 offset;
254- //
255- // offset = get_cursor();
256- // if (character == '\n')
257- // {
258- // // Переводим строку.
259- // if ((offset / 2 / MAX_COLS) == (MAX_ROWS - 1))
260- // scroll_line();
261- // else
262- // set_cursor((offset - offset % MAX_COLS) + MAX_COLS*2);
263- // }
264- // else
265- // {
266- // if (offset == (MAX_COLS * MAX_ROWS * 2)) scroll_line();
267- // write(character, attribute_byte, offset);
268- // set_cursor(offset+2);
269- // }
270- // }
271- //
272- // void scroll_line()
273- // {
274- // /* Функция скроллинга */
275- //
276- // u8 i = 1; // Начинаем со второй строки.
277- // u16 last_line; // Начало последней строки.
278- //
279- // while (i < MAX_ROWS)
280- // {
281- // memcpy(
282- // (u8 *)(VIDEO_ADDRESS + (MAX_COLS * i * 2)),
283- // (u8 *)(VIDEO_ADDRESS + (MAX_COLS * (i-1) * 2)),
284- // (MAX_COLS*2)
285- // );
286- // i++;
287- // }
288- //
289- // last_line = (MAX_COLS*MAX_ROWS*2) - MAX_COLS*2;
290- // i = 0;
291- // while (i < MAX_COLS)
292- // {
293- // write('\0', WHITE_ON_BLACK, (last_line + i * 2));
294- // i++;
295- // }
296- // set_cursor(last_line);
297- // }
298- //
299- // void clear_screen()
300- // {
301- // /* Функция очистки экрана */
302- //
303- // u16 offset = 0;
304- // while (offset < (MAX_ROWS * MAX_COLS * 2))
305- // {
306- // write('\0', WHITE_ON_BLACK, offset);
307- // offset += 2;
308- // }
309- // set_cursor(0);
310- // }
311- //
312- // void write(u8 character, u8 attribute_byte, u16 offset)
313- // {
314- // /* Функция печати символа на экран с помощью VGA по адресу 0xb8000 */
315- //
316- // // u8 character: байт, соответствующий символу
317- // // u8 attribute_byte: байт, соответствующий цвету текста/фона символа
318- // // u16 offset: смещение (позиция), по которому нужно распечатать символ
319- //
320- // u8 *vga = (u8 *) VIDEO_ADDRESS;
321- // vga[offset] = character;
322- // vga[offset + 1] = attribute_byte;
323- // }
324- //
325- // u16 get_cursor()
326- // {
327- // /* Функция, возвращающая позицию курсора (char offset). */
328- //
329- // port_byte_out(REG_SCREEN_CTRL, 14); // Запрашиваем верхний байт
330- // u8 high_byte = port_byte_in(REG_SCREEN_DATA); // Принимаем его
331- // port_byte_out(REG_SCREEN_CTRL, 15); // Запрашиваем нижний байт
332- // u8 low_byte = port_byte_in(REG_SCREEN_DATA); // Принимаем и его
333- // // Возвращаем смещение умножая его на 2, т.к. порты возвращают смещение в
334- // // клетках экрана (cell offset), а нам нужно в символах (char offset), т.к.
335- // // на каждый символ у нас 2 байта
336- // return (((high_byte << 8) + low_byte) * 2);
337- // }
338- //
339- // void set_cursor(u16 pos)
340- // {
341- // /* Функция, устаналивающая курсор по смещнию (позиции) pos */
342- //
343- // pos /= 2; // конвертируем в cell offset (в позицию по клеткам, а не
344- // // символам)
345- // // Устанавливаем позицию курсора
346- // port_byte_out(REG_SCREEN_CTRL, 14); // Указываем, что будем
347- // // передавать верхний байт
348- // port_byte_out(REG_SCREEN_DATA, (pos >> 8)); // Передаем верхний байт
349- // port_byte_out(REG_SCREEN_CTRL, 15); // Указываем, что будем
350- // // передавать нижний байт
351- // port_byte_out(REG_SCREEN_DATA, (pos & 0xff)); // передаем нижний байт
352- // }
0 commit comments