	#include "io.h" // Подключаем наши порты
#include <stdint.h>

#define COM1 0x3F8

void serial_init(void) {
    outb(COM1 + 1, 0x00);    
    outb(COM1 + 3, 0x80);    
    outb(COM1 + 0, 0x03);    
    outb(COM1 + 1, 0x00);    
    outb(COM1 + 3, 0x03);    
    outb(COM1 + 2, 0xC7);    
}

int is_transmit_empty(void) {
    return inb(COM1 + 5) & 0x20;
}

void serial_putc(char c) {
    while (is_transmit_empty() == 0);
    outb(COM1, c);
}

void kprint_serial(const char* str) {
    for (int i = 0; str[i] != '\0'; i++) {
        serial_putc(str[i]);
    }
}

void kprint_serial_hex(uint32_t num) {
    const char hex_chars[] = "0123456789ABCDEF";
    char buffer[11]; // "0x" + 8 символов + '\0'
    
    buffer[0] = '0';
    buffer[1] = 'x';
    buffer[10] = '\0';
    
    // Заполняем с конца (8 символов)
    for (int i = 9; i >= 2; i--) {
        buffer[i] = hex_chars[num & 0xF];
        num >>= 4;
    }
    
    kprint_serial(buffer);
}

void kprint_serial_dec(uint32_t num) {
    if (num == 0) {
        kprint_serial("0");
        return;
    }
    char buf[12];
    int i = 10;
    buf[11] = '\0';
    while (num > 0) {
        buf[i--] = (num % 10) + '0';
        num /= 10;
    }
    kprint_serial(&buf[i + 1]);
}
