Click here to Skip to main content
15,943,136 members
Please Sign up or sign in to vote.
1.00/5 (3 votes)
See more:
Here's my code:
C
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

enum vga_color {
    VGA_COLOR_BLACK = 0,
    VGA_COLOR_BLUE = 1,
    VGA_COLOR_GREEN = 2,
    VGA_COLOR_CYAN = 3,
    VGA_COLOR_RED = 4,
    VGA_COLOR_MAGENTA = 5,
    VGA_COLOR_BROWN = 6,
    VGA_COLOR_LIGHT_GREY = 7,
    VGA_COLOR_DARK_GREY = 8,
    VGA_COLOR_LIGHT_BLUE = 9,
    VGA_COLOR_LIGHT_GREEN = 10,
    VGA_COLOR_LIGHT_CYAN = 11,
    VGA_COLOR_LIGHT_RED = 12,
    VGA_COLOR_LIGHT_MAGENTA = 13,
    VGA_COLOR_LIGHT_BROWN = 14,
    VGA_COLOR_WHITE = 15, };

static inline uint8_t vga_entry_color
 (enum vga_color fg, enum vga_color bg) {
    return fg | bg << 4; }
 
static inline uint16_t vga_entry(unsigned char uc, uint8_t color) {
    return (uint16_t) uc | (uint16_t) color << 8; }
 
size_t strlen(const char* str) {
    size_t len = 0;
    while (str[len])
        len++;
    return len; }
 
static const size_t VGA_WIDTH = 80;
static const size_t VGA_HEIGHT = 25;
 
size_t terminal_row;
size_t terminal_column;
uint8_t terminal_color;
uint16_t* terminal_buffer;

 
void terminal_initialize(void) {
    terminal_row = 0;
    terminal_column = 0;
    terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
    terminal_buffer = (uint16_t*) 0xB8000;
    for (size_t y = 0; y < VGA_HEIGHT; y++) {
        for (size_t x = 0; x < VGA_WIDTH; x++) {
            const size_t index = y * VGA_WIDTH + x;
            terminal_buffer[index] = vga_entry(' ', terminal_color); } } }

void terminal_setcolor(uint8_t color) {
    terminal_color = color; }
 
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y) {
    const size_t index = y * VGA_WIDTH + x;
    terminal_buffer[index] = vga_entry(c, color); }
 
void terminal_scroll(void) {
  for (size_t y = 0; y < VGA_HEIGHT - 1; y++) {
    for (size_t x = 0; x < VGA_WIDTH; x++) {
      const size_t current_index = y * VGA_WIDTH + x;
      const size_t next_line_index = (y + 1) * VGA_WIDTH + x;
      terminal_buffer[current_index] = terminal_buffer[next_line_index]; } }
  const size_t last_row_index = (VGA_HEIGHT - 1) * VGA_WIDTH;
  for (size_t x = 0; x < VGA_WIDTH; x++) {
    terminal_buffer[last_row_index + x] = vga_entry(' ', terminal_color); } }

void terminal_putchar(char c) {
  if (c == '\n') {
    terminal_row++;
    terminal_column = 0; } else {
    terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
    terminal_column++; }

  if (terminal_column >= VGA_WIDTH) {
    terminal_row++;
    terminal_column = 0; }

  if (terminal_row >= VGA_HEIGHT) {
    terminal_scroll();
    terminal_row = VGA_HEIGHT - 1; } }
 
void terminal_write(const char* data, size_t size) {
    for (size_t i = 0; i < size; i++)
        terminal_putchar(data[i]); }
 
void printl(const char* data) {
 terminal_write(data, strlen(data)); }

uint8_t inb(uint16_t port) {
 uint8_t ret;
 asm volatile("inb %1, %0" : "=a"(ret) : "d"(port));
 return ret; }

void outb(uint16_t port, uint8_t data) {
 asm volatile("outb %0, %1" : "=a"(data) : "d"(port)); }

void kernel_main(void) {
    terminal_initialize();
    printl("LainOS\n"); 


What I have tried:

I was trying to add:
C
while (true) {
    char c = inb(0x60);
    if (c != 0) {
    terminal_putchar(c); } } }

In the void kernel_main, it works, but it prints the character all over the screen and not like I expect.
Posted
Updated 27-Oct-23 5:30am
v2
Comments
Richard MacCutchan 26-Oct-23 7:53am    
You need to check the inb function to see what it is returning.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900