NeonLightions

kernel.c

Sep 14th, 2021
616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.66 KB | None | 0 0
  1. //---------------------------------------- Include headers ----------------------------------------
  2. #include <stdint.h>
  3. #include <stddef.h>
  4. #include <stdbool.h>
  5. #include <stdlib.h>
  6. //-------------------------------------------------------------------------------------------------
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17. //---------------------------------------- Variables ----------------------------------------------
  18. static bool shift_pressed = false;
  19. static const size_t VGA_WIDTH = 80;
  20. static const size_t VGA_HEIGHT = 25;
  21. size_t terminal_column;
  22. size_t terminal_row;
  23. uint8_t terminal_color;
  24. uint16_t* terminal_buffer;
  25. //-------------------------------------------------------------------------------------------------
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36. //--------------------------------------- VGA colors ----------------------------------------------
  37. // Declare VGA colors
  38. enum vga_color {
  39.     BLACK = 0,
  40.     GREEN = 1,
  41.     BLUE = 2,
  42.     CYAN = 3,
  43.     RED = 4,
  44.     MAGENTA = 5,
  45.     BROWN = 6,
  46.     LIGHT_GREY = 7,
  47.     GREY = 8,
  48.     LIGHT_GREEN = 9,
  49.     LIGHT_BLUE = 10,
  50.     LIGHT_CYAN = 11,
  51.     LIGHT_RED = 12,
  52.     LIGHT_MAGENTA = 13,
  53.     YELLOW = 14,
  54.     WHITE = 15,
  55. };
  56. //-----------------------------------------------------------------------------------------------------
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67. //------------------------------------------ Keycode --------------------------------------------------
  68. // Define keyboard port
  69. #define KEYBOARD_PORT 0x60
  70.  
  71. // Define keys
  72. #define KEY_A 0x1E
  73. #define KEY_B 0x30
  74. #define KEY_C 0x2E
  75. #define KEY_D 0x20
  76. #define KEY_E 0x12
  77. #define KEY_F 0x21
  78. #define KEY_G 0x22
  79. #define KEY_H 0x23
  80. #define KEY_I 0x17
  81. #define KEY_J 0x24
  82. #define KEY_K 0x25
  83. #define KEY_L 0x26
  84. #define KEY_M 0x32
  85. #define KEY_N 0x31
  86. #define KEY_O 0x18
  87. #define KEY_P 0x19
  88. #define KEY_Q 0x10
  89. #define KEY_R 0x13
  90. #define KEY_S 0x1F
  91. #define KEY_T 0x14
  92. #define KEY_U 0x16
  93. #define KEY_V 0x2F
  94. #define KEY_W 0x11
  95. #define KEY_X 0x2D
  96. #define KEY_Y 0x15
  97. #define KEY_Z 0x2C
  98. #define KEY_1 0x02
  99. #define KEY_2 0x03
  100. #define KEY_3 0x04
  101. #define KEY_4 0x05
  102. #define KEY_5 0x06
  103. #define KEY_6 0x07
  104. #define KEY_7 0x08
  105. #define KEY_8 0x09
  106. #define KEY_9 0x0A
  107. #define KEY_0 0x0B
  108. #define KEY_MINUS 0x0C
  109. #define KEY_EQUAL 0x0D
  110. #define KEY_SQUARE_OPEN_BRACKET 0x1A
  111. #define KEY_SQUARE_CLOSE_BRACKET 0x1B
  112. #define KEY_SEMICOLON 0x27
  113. #define KEY_BACKSLASH 0x2B
  114. #define KEY_COMMA 0x33
  115. #define KEY_DOT 0x34
  116. #define KEY_FORESLHASH 0x35
  117. #define KEY_F1 0x3B
  118. #define KEY_F2 0x3C
  119. #define KEY_F3 0x3D
  120. #define KEY_F4 0x3E
  121. #define KEY_F5 0x3F
  122. #define KEY_F6 0x40
  123. #define KEY_F7 0x41
  124. #define KEY_F8 0x42
  125. #define KEY_F9 0x43
  126. #define KEY_F10 0x44
  127. #define KEY_F11 0x85
  128. #define KEY_F12 0x86
  129. #define KEY_BACKSPACE 0x0E
  130. #define KEY_DELETE 0x53
  131. #define KEY_DOWN 0x50
  132. #define KEY_END 0x4F
  133. #define KEY_ENTER 0x1C
  134. #define KEY_ESC 0x01
  135. #define KEY_HOME 0x47
  136. #define KEY_INSERT 0x52
  137. #define KEY_KEYPAD_5 0x4C
  138. #define KEY_KEYPAD_MUL 0x37
  139. #define KEY_KEYPAD_Minus 0x4A
  140. #define KEY_KEYPAD_PLUS 0x4E
  141. #define KEY_KEYPAD_DIV 0x35
  142. #define KEY_LEFT 0x4B
  143. #define KEY_PAGE_DOWN 0x51
  144. #define KEY_PAGE_UP 0x49
  145. #define KEY_PRINT_SCREEN 0x37
  146. #define KEY_RIGHT 0x4D
  147. #define KEY_SPACE 0x39
  148. #define KEY_TAB 0x0F
  149. #define KEY_UP 0x48
  150. #define KEY_SHIFT_HOLD 0x2A
  151. #define KEY_SHIFT_RELEASE 0xAA
  152. #define LEFT_MOUSE_BUTTON 0x0001
  153.  
  154.  
  155. char get_ascii_char(uint8_t key_code)
  156. {
  157.   switch(key_code){
  158.     case KEY_A : return 'a';
  159.     case KEY_B : return 'b';
  160.     case KEY_C : return 'c';
  161.     case KEY_D : return 'd';
  162.     case KEY_E : return 'e';
  163.     case KEY_F : return 'f';
  164.     case KEY_G : return 'g';
  165.     case KEY_H : return 'h';
  166.     case KEY_I : return 'i';
  167.     case KEY_J : return 'j';
  168.     case KEY_K : return 'k';
  169.     case KEY_L : return 'l';
  170.     case KEY_M : return 'm';
  171.     case KEY_N : return 'n';
  172.     case KEY_O : return 'o';
  173.     case KEY_P : return 'p';
  174.     case KEY_Q : return 'q';
  175.     case KEY_R : return 'r';
  176.     case KEY_S : return 's';
  177.     case KEY_T : return 't';
  178.     case KEY_U : return 'u';
  179.     case KEY_V : return 'v';
  180.     case KEY_W : return 'w';
  181.     case KEY_X : return 'x';
  182.     case KEY_Y : return 'y';
  183.     case KEY_Z : return 'z';
  184.     case KEY_1 : return '1';
  185.     case KEY_2 : return '2';
  186.     case KEY_3 : return '3';
  187.     case KEY_4 : return '4';
  188.     case KEY_5 : return '5';
  189.     case KEY_6 : return '6';
  190.     case KEY_7 : return '7';
  191.     case KEY_8 : return '8';
  192.     case KEY_9 : return '9';
  193.     case KEY_0 : return '0';
  194.     case KEY_MINUS : return '-';
  195.     case KEY_EQUAL : return '=';
  196.     case KEY_SQUARE_OPEN_BRACKET : return '[';
  197.     case KEY_SQUARE_CLOSE_BRACKET : return ']';
  198.     case KEY_SEMICOLON : return ';';
  199.     case KEY_BACKSLASH : return '\\';
  200.     case KEY_COMMA : return ',';
  201.     case KEY_DOT : return '.';
  202.     case KEY_FORESLHASH : return '/';
  203.     case KEY_SPACE : return ' ';
  204.     case KEY_ENTER : return '\n';
  205.     case KEY_BACKSPACE: return '\b';
  206.     default : return 0;
  207.   }
  208. }
  209.  
  210.  
  211. char get_ascii_shift_char(uint8_t key_code)
  212. {
  213.   switch(key_code){
  214.     case KEY_A : return 'A';
  215.     case KEY_B : return 'B';
  216.     case KEY_C : return 'C';
  217.     case KEY_D : return 'D';
  218.     case KEY_E : return 'E';
  219.     case KEY_F : return 'F';
  220.     case KEY_G : return 'G';
  221.     case KEY_H : return 'H';
  222.     case KEY_I : return 'I';
  223.     case KEY_J : return 'J';
  224.     case KEY_K : return 'K';
  225.     case KEY_L : return 'L';
  226.     case KEY_M : return 'M';
  227.     case KEY_N : return 'N';
  228.     case KEY_O : return 'O';
  229.     case KEY_P : return 'P';
  230.     case KEY_Q : return 'Q';
  231.     case KEY_R : return 'R';
  232.     case KEY_S : return 'S';
  233.     case KEY_T : return 'T';
  234.     case KEY_U : return 'U';
  235.     case KEY_V : return 'V';
  236.     case KEY_W : return 'W';
  237.     case KEY_X : return 'X';
  238.     case KEY_Y : return 'Y';
  239.     case KEY_Z : return 'Z';
  240.     case KEY_1 : return '!';
  241.     case KEY_2 : return '@';
  242.     case KEY_3 : return '#';
  243.     case KEY_4 : return '$';
  244.     case KEY_5 : return '%';
  245.     case KEY_6 : return '^';
  246.     case KEY_7 : return '&';
  247.     case KEY_8 : return '*';
  248.     case KEY_9 : return '(';
  249.     case KEY_0 : return ')';
  250.     case KEY_MINUS : return '_';
  251.     case KEY_EQUAL : return '+';
  252.     case KEY_SQUARE_OPEN_BRACKET : return '{';
  253.     case KEY_SQUARE_CLOSE_BRACKET : return '}';
  254.     case KEY_SEMICOLON : return ':';
  255.     case KEY_BACKSLASH : return '|';
  256.     case KEY_COMMA : return '<';
  257.     case KEY_DOT : return '>';
  258.     case KEY_FORESLHASH : return '/';
  259.     case KEY_SPACE : return ' ';
  260.     case KEY_ENTER : return '\n';
  261.     case KEY_BACKSPACE: return '\b';
  262.     default : return 0;
  263.   }
  264. }
  265. //-------------------------------------------------------------------------------------------------
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276. //-------------------------------------------- VGA ------------------------------------------------
  277. static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
  278. {
  279.     return fg | bg << 4;
  280. }
  281.  
  282.  
  283.  
  284. static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
  285. {
  286.     return (uint16_t) uc | (uint16_t) color << 8;
  287. }
  288. //----------------------------------------------------------------------------------------------------
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299. //-------------------------------------------- Sundry functions --------------------------------------
  300. size_t strlen(const char* data)
  301. {
  302.     size_t len = 0;
  303.     while (data[len])
  304.     {
  305.         len++;
  306.     }
  307.     return len;
  308. }
  309.  
  310.  
  311.  
  312. void sleep(uint32_t time)
  313. {
  314.     while (true)
  315.     {
  316.         asm volatile("nop");
  317.         time--;
  318.         if (time <= 0)
  319.             break;
  320.     }
  321. }
  322. //----------------------------------------------------------------------------------------------------
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333. //-------------------------------------------- Struct Stack -------------------------------------------------
  334. typedef uint16_t* item;
  335.  
  336. typedef struct Stack
  337. {
  338.     struct Node *Top;
  339. };
  340.  
  341.  
  342. struct Node
  343. {
  344.     item Data;
  345.     struct Node *Next;
  346. };
  347.  
  348.  
  349.  
  350.  
  351. void Init(struct Stack S);
  352. int Isempty(struct Stack S);
  353. int Len(struct Stack S);
  354. void Push(struct Stack S, item x);
  355. item Peak(struct Stack S);
  356. item Pop(struct Stack S);
  357. struct Node *MakeNode(item x);
  358.  
  359.  
  360.  
  361. void Init(struct Stack S)
  362. {
  363.     S.Top = NULL;
  364. }
  365.  
  366.  
  367. int Isempty(struct Stack S)
  368. {
  369.     return (S.Top == NULL);
  370. }
  371.  
  372.  
  373. int Len(struct Stack S)
  374. {
  375.     struct Node *P = S.Top;
  376.     int i = 0;
  377.     while (P != NULL)
  378.     {
  379.         i++;
  380.         P = P -> Next;
  381.     }
  382.     return i;
  383. }
  384.  
  385.  
  386. struct Node *MakeNode(item x)
  387. {
  388.     struct Node *P = (struct Node*) malloc(sizeof(struct Node));
  389.     P->Next = NULL;
  390.     P->Data = x;
  391.     return P;
  392. }
  393.  
  394.  
  395. item Peak(struct Stack S)
  396. {
  397.     return S.Top->Data;
  398. }
  399.  
  400.  
  401. item Pop(struct Stack S)
  402. {
  403.     if (!Isempty(S))
  404.     {
  405.         item x = S.Top->Data;
  406.         S.Top = S.Top->Next;
  407.         return x;
  408.     }
  409. }
  410. //----------------------------------------------------------------------------------------------------
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421. //-------------------------------------------- Screen ------------------------------------------------
  422. void init(void)
  423. {
  424.     terminal_column = 0;
  425.     terminal_row = 0;
  426.     terminal_color = vga_entry_color(LIGHT_GREY, BLACK);
  427.     terminal_buffer = (uint16_t*) 0xB8000;
  428.     for (size_t y = 0; y < VGA_HEIGHT; y++) {
  429.         for (size_t x = 0; x < VGA_WIDTH; x++) {
  430.             const size_t index = y * VGA_WIDTH + x;
  431.             terminal_buffer[index] = vga_entry(' ', terminal_color);
  432.         }
  433.     }
  434. }
  435.  
  436.  
  437.  
  438. void clear_screen()
  439. {
  440.     for (size_t y = 0; y < VGA_HEIGHT; y++) {
  441.         for (size_t x = 0; x < VGA_WIDTH; x++) {
  442.             const size_t index = y * VGA_WIDTH + x;
  443.             terminal_buffer[index] = vga_entry(' ', terminal_color);
  444.         }
  445.     }  
  446. }
  447.  
  448.  
  449.  
  450. void set_color(uint8_t color)
  451. {
  452.     terminal_color = color;
  453. }
  454. //-------------------------------------------------------------------------------------------------
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465. //--------------------------------------- Print --------------------------------------------------
  466. void putentryat(char c, uint8_t color, size_t x, size_t y)
  467. {
  468.     const size_t index = y * VGA_WIDTH + x;
  469.     terminal_buffer[index] = vga_entry(c, color);
  470. }
  471.  
  472.  
  473.  
  474. void putchar(char c)
  475. {
  476.     putentryat(c, terminal_color, terminal_column, terminal_row);
  477.     if (++terminal_column == VGA_WIDTH) {
  478.         terminal_column = 0;
  479.         if (++terminal_row == VGA_HEIGHT) {
  480.             screen_scrolling_up();
  481.         }
  482.     }
  483. }
  484.  
  485.  
  486.  
  487. void write(const char* data, size_t len)
  488. {
  489.     for (size_t i = 0; i < len; i++) {
  490.         switch (data[i])
  491.         {
  492.         case '\n': {
  493.             terminal_column = 0;
  494.             terminal_row += 1;
  495.         };
  496.         case '\t': {
  497.             terminal_column += 4;
  498.             if (terminal_column > VGA_WIDTH) {
  499.                 size_t modulo = terminal_column % VGA_WIDTH;
  500.                 terminal_column = 0;
  501.                 terminal_column += modulo;
  502.                 terminal_row += 1;
  503.             }
  504.         };
  505.         case '\0': putchar('0');
  506.         case '\b': {
  507.             const size_t index = terminal_row * VGA_WIDTH + terminal_column;
  508.             terminal_buffer[index - 1] = vga_entry(' ', terminal_color);
  509.             terminal_column -= 1;
  510.         };
  511.         default:
  512.             putchar(data[i]);
  513.         }
  514.     }
  515. }
  516.  
  517.  
  518.  
  519. void print(const char* data)
  520. {
  521.     write(data, strlen(data));
  522. }
  523. //-------------------------------------------------------------------------------------------------
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534. //------------------------------------------- Scancode --------------------------------------------
  535. uint8_t inb(uint16_t port)
  536. {
  537.     uint8_t ret;
  538.     asm volatile("inb %1, %0" : "=a"(ret) : "d"(port));
  539.     return ret;
  540. }
  541.  
  542.  
  543.  
  544. void outb(uint16_t port, uint8_t data)
  545. {
  546.     asm volatile("outb %0, %1" : "=a"(data) : "d"(port));
  547. }
  548.  
  549.  
  550.  
  551. char get_input_keycode()
  552. {
  553.     char ch = 0;
  554.     while (( ch = inb(KEYBOARD_PORT)) != 0)
  555.         if (ch > 0)
  556.             return ch;
  557.     return ch;
  558. }
  559.  
  560.  
  561.  
  562. void shift_scancode()
  563. {
  564.     char ch = 0;
  565.     char keycode = 0;
  566.     bool check = true;;
  567.     do {
  568.     keycode = get_input_keycode();
  569.     if (keycode == KEY_ENTER){
  570.       terminal_column = 0;
  571.       terminal_row += 1;
  572.     } else if (keycode == KEY_BACKSPACE) {
  573.         const size_t index = terminal_row * VGA_WIDTH + terminal_column;
  574.         terminal_buffer[index - 1] = vga_entry(' ', terminal_color);
  575.         terminal_column -= 1;        
  576.     } else if (keycode == KEY_TAB) {
  577.         terminal_column += 4;
  578.         if (terminal_column > VGA_WIDTH) {
  579.             size_t modulo = terminal_column % VGA_WIDTH;
  580.             terminal_column = 0;
  581.             terminal_column += modulo;
  582.             terminal_row += 1;
  583.         }
  584.     } else if (keycode == KEY_SHIFT_RELEASE) {
  585.         print("Release shift");
  586.     } else if (keycode == KEY_UP) {
  587.         screen_scrolling_down();
  588.     } else if (keycode == KEY_DOWN) {
  589.         screen_scrolling_up_when_press();
  590.     } else {
  591.         ch = get_ascii_shift_char(keycode);
  592.         putchar(ch);
  593.         check = false;
  594.     }
  595.     sleep(0x02FFFFFF);
  596.     } while (check == true);
  597. }
  598.  
  599.  
  600.  
  601. void test_input()
  602. {
  603.   char ch = 0;
  604.   char keycode = 0;
  605.   do{
  606.     keycode = get_input_keycode();
  607.     if (keycode == KEY_ENTER){
  608.       terminal_column = 0;
  609.       terminal_row += 1;
  610.     } else if (keycode == KEY_BACKSPACE) {
  611.         const size_t index = terminal_row * VGA_WIDTH + terminal_column;
  612.         terminal_buffer[index - 1] = vga_entry(' ', terminal_color);
  613.         terminal_column -= 1;        
  614.     } else if (keycode == KEY_TAB) {
  615.         terminal_column += 4;
  616.         if (terminal_column > VGA_WIDTH) {
  617.             size_t modulo = terminal_column % VGA_WIDTH;
  618.             terminal_column = 0;
  619.             terminal_column += modulo;
  620.             terminal_row += 1;
  621.         }
  622.     } else if (keycode == KEY_SHIFT_HOLD) {
  623.         shift_scancode();
  624.     } else {
  625.         ch = get_ascii_char(keycode);
  626.         putchar(ch);
  627.     }
  628.     sleep(0x02FFFFFF);
  629.   } while(keycode != KEY_ENTER);
  630. }
  631. //-------------------------------------------------------------------------------------------------
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642. //-------------------------------------- Screen handler -------------------------------------------
  643. static struct Stack stack_first_line;
  644. static struct Stack stack_last_line;
  645.  
  646.  
  647.  
  648. void screen_scrolling_up();
  649. void screen_scrolling_down();
  650. void load_fisrt_line();
  651. void load_last_line();
  652.  
  653.  
  654.  
  655. void screen_scrolling_up()
  656. {
  657.     Init(stack_first_line);
  658.     terminal_column = 0;
  659.     terminal_row = 24;
  660.     item new_buffer = (item) 0xB8000;
  661.     for (size_t x = 0; x < VGA_WIDTH; x++)
  662.     {
  663.         new_buffer[x] = terminal_buffer[x];
  664.     }
  665.     Push(stack_first_line, new_buffer);
  666.     for (size_t y = 1; y < VGA_HEIGHT; y++) {
  667.         for (size_t x = 0; x < VGA_WIDTH; x++) {
  668.             const size_t current_index = y * VGA_WIDTH + x;
  669.             const size_t new_index = (y - 1) * VGA_WIDTH + x;
  670.             terminal_buffer[new_index] = terminal_buffer[current_index];
  671.             terminal_buffer[current_index] = vga_entry(' ', terminal_color);
  672.         }
  673.     }
  674.     for (size_t x = 0; x < VGA_WIDTH; x++) {
  675.         const size_t index = 24 * VGA_WIDTH + x;
  676.         terminal_buffer[index] = vga_entry(' ', terminal_color);
  677.     }
  678. }
  679.  
  680.  
  681.  
  682. void screen_scrolling_up_when_press()
  683. {
  684.     Init(stack_first_line);
  685.     terminal_column = 0;
  686.     terminal_row = 24;
  687.     item new_buffer = (item) 0xB8000;
  688.     for (size_t x = 0; x < VGA_WIDTH; x++)
  689.     {
  690.         new_buffer[x] = terminal_buffer[x];
  691.     }
  692.     Push(stack_first_line, new_buffer);
  693.     for (size_t y = 1; y < VGA_HEIGHT; y++) {
  694.         for (size_t x = 0; x < VGA_WIDTH; x++) {
  695.             const size_t current_index = y * VGA_WIDTH + x;
  696.             const size_t new_index = (y - 1) * VGA_WIDTH + x;
  697.             terminal_buffer[new_index] = terminal_buffer[current_index];
  698.             terminal_buffer[current_index] = vga_entry(' ', terminal_color);
  699.         }
  700.     }
  701.     for (size_t x = 0; x < VGA_WIDTH; x++) {
  702.         const size_t index = 24 * VGA_WIDTH + x;
  703.         terminal_buffer[index] = vga_entry(' ', terminal_color);
  704.     }
  705.     load_last_line();
  706. }
  707.  
  708.  
  709.  
  710. void screen_scrolling_down()
  711. {
  712.     Init(stack_last_line);
  713.     terminal_column = 0;
  714.     terminal_row -= 1;
  715.     item new_buffer = (item) 0xB8000;
  716.     for (size_t column = 1920; column < 2000; column++)
  717.         new_buffer[column] = terminal_buffer[column];
  718.     Push(stack_last_line, new_buffer);
  719.     for (size_t y = 0; y < VGA_HEIGHT - 1; y++) {
  720.         for (size_t x = 0; x < VGA_WIDTH; x++) {
  721.             const size_t current_index = y * VGA_WIDTH + x;
  722.             const size_t new_index = (y + 1) * VGA_WIDTH + x;
  723.             terminal_buffer[new_index] = terminal_buffer[current_index];
  724.             terminal_buffer[current_index] = vga_entry(' ', terminal_color);
  725.         }
  726.     }
  727.     for (size_t x = 0; x < VGA_WIDTH; x++) {
  728.         const size_t index = 0 * VGA_WIDTH + x;
  729.         terminal_buffer[index] = vga_entry(' ', terminal_color);
  730.     }
  731.     load_fisrt_line();
  732. }
  733.  
  734.  
  735.  
  736. void load_first_line()
  737. {
  738.     item new_buffer = (item) 0xB8000;
  739.     new_buffer = Pop(stack_first_line);
  740.     for (size_t index = 0; index < VGA_WIDTH; index++)
  741.         terminal_buffer[index] = new_buffer[index];
  742. }
  743.  
  744.  
  745.  
  746. void load_last_line()
  747. {
  748.     item new_buffer = (item) 0xB8000;
  749.     new_buffer = Pop(stack_last_line);
  750.     for (size_t index = 1920; index < VGA_WIDTH * VGA_HEIGHT; index++)
  751.         terminal_buffer[index] = new_buffer[index];
  752. }
  753. //-------------------------------------------------------------------------------------------------
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764. //------------------------------------------- Kernel ----------------------------------------------
  765. void kernel_main(void)
  766. {
  767.     init();
  768.  
  769.     bool ch = false;
  770.  
  771.     print("Hello World!");
  772.  
  773.     test_input();
  774.  
  775.     print("Hello World!");
  776.     while (ch == false) {
  777.         print("I'm awesome");
  778.         sleep(80000000);;
  779.     }
  780.     screen_scrolling_up();
  781.  
  782. }
  783. //-------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment