CeDOS - boot/main.c

boot/main.c (view raw)

#include <stdint.h>
#include <stddef.h>

#include "string.h"
#include "fat12.h"

void printc(char c) {
    static uint8_t *display = (uint8_t*)(0xB8000);
    *(display++) = c;
    *(display++) = 0x0F;
}

void print_string(const char *str) {
    while (*str != 0) {
        printc(*(str++));
    }
}

void assert_failed(const char *message) {
    print_string(message);

    while (1) {}
}

FAT12_descriptor_t fat_desc;

void *FAT12_read(uint32_t lba, uint32_t *offset, size_t size, void *buffer) {
    void *FAT_addr = (void*)(0x10000);

    if (offset != NULL) {
        lba += (*offset) / fat_desc.bytes_per_sect;
        *offset = (*offset) % fat_desc.bytes_per_sect;

        void *ptr = (void*)((long)(FAT_addr) + (long)(lba * fat_desc.bytes_per_sect));
        return memcpy(buffer, ptr + *offset, size);
    } else {
        void *ptr = (void*)((long)(FAT_addr) + (long)(lba * fat_desc.bytes_per_sect));
        return memcpy(buffer, ptr, size);
    }
}

int load_kernel() {
    // debug output
    uint8_t *dbuf = (uint8_t *)(0x10000);
    for (int i = 0; i < 16; i++) {
        uint8_t value = dbuf[i];
        char lut[] = "0123456789ABCDEF";

        uint8_t low = value & 0x0F;
        uint8_t high = value >> 4;

        printc(lut[high]);
        printc(lut[low]);
        printc(' ');
    }

    //while (1);
    FAT12_init(&fat_desc);

    int i = 0;

    // first cluster of kernel.bin file
    uint16_t first_cluster;

    while (1) {
        char buffer[832];
        uint32_t file_size;

        i = FAT12_root_dir_next(&fat_desc, i, buffer, &first_cluster, &file_size);

        print_string(buffer);
        print_string("  ");
        if (i <= 0) { return -1; }

        if (!(strcmp(buffer, "kernel.bin"))) { break; }
        if (!(strcmp(buffer, "KERNEL.BIN"))) { break; }
    }

    // copy all clusters
    uint16_t cluster = first_cluster;
    uint8_t *buffer = (uint8_t *)(0x100000);
    while (1) {
        buffer = FAT12_read_cluster(&fat_desc, cluster, buffer);
        cluster = FAT12_next_cluster(&fat_desc, cluster);
        
        if (cluster == 0xFFF || cluster == 0x000) { break; }
    }

    return 0;
}