From 4b81def864f3d3a1129b3c56c2132b1dd8410aff Mon Sep 17 00:00:00 2001 From: Hopeless Tyromancy Date: Thu, 5 Feb 2026 09:47:16 -0500 Subject: [PATCH] Added font and primitive logging capacity --- .gitignore | 2 + bin/os | Bin 57880 -> 65456 bytes bochs.txt | 3 ++ image.hdd | Bin 67108864 -> 67108864 bytes obj/src/int.c.d | 3 +- obj/src/int.c.o | Bin 130152 -> 130400 bytes obj/src/main.c.d | 5 +- obj/src/main.c.o | Bin 14144 -> 13752 bytes src/acpi.c | 52 ++++++++++++++++++++ src/common.h | 17 +++++++ src/etc.h | 12 +++++ src/font.h | 124 +++++++++++++++++++++++++++++++++++++++++++++++ src/int.c | 44 ++++++++--------- src/main.c | 41 ++++++++-------- src/print.c | 87 +++++++++++++++++++++++++++++++++ src/print.h | 10 ++++ src/rep.pl | 5 ++ 17 files changed, 362 insertions(+), 43 deletions(-) create mode 100644 .gitignore create mode 100644 bochs.txt create mode 100644 src/acpi.c create mode 100644 src/common.h create mode 100644 src/etc.h create mode 100644 src/font.h create mode 100644 src/print.c create mode 100644 src/print.h create mode 100644 src/rep.pl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6e49ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +obj/ +bin/ diff --git a/bin/os b/bin/os index f89cea2c6d0ed324ae0ebb96bbe91747e5b8afca..87903952a57c5c43a4c05f1863b89dbf82c30a9c 100755 GIT binary patch delta 19675 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Π5vfnbClh_DlzhgKj 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 diff --git a/bochs.txt b/bochs.txt new file mode 100644 index 0000000..b4d164d --- /dev/null +++ b/bochs.txt @@ -0,0 +1,3 @@ +vga: extension=vgahw +display_library: x, options="gui_debug" + diff --git a/image.hdd b/image.hdd index 6a15664896865811e1cd4594f10f285fd14c0084..b879f019718ef00c82e1772284e54f5113994124 100644 GIT binary patch delta 25307 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%0A9;M4}tYKEZHQq6f;ZKgn=Zq8G|J#c))j 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 Xl}GyvqkX2)e&b;8J8xD9eXs`ry3a4>#n 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⁢vp$#U<}SWq+W_KAK$kSlsg& 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 N(T=fVy5k>4bpY7_6g2<< delta 13670 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 mg&PvnoBlAGaZam%NLNlj_=nM)=|~q diff --git a/obj/src/main.c.d b/obj/src/main.c.d index 008772b..b94abe3 100644 --- a/obj/src/main.c.d +++ b/obj/src/main.c.d @@ -1,2 +1,5 @@ -obj/src/main.c.o: src/main.c src/../include/limine.h +obj/src/main.c.o: src/main.c src/../include/limine.h src/common.h \ + src/print.h src/../include/limine.h: +src/common.h: +src/print.h: diff --git a/obj/src/main.c.o b/obj/src/main.c.o index fd9ee5f80936946c2d92f489a8dcbbe6dbc3b3ae..3d4f34c236f92145c4ca5a7ac57f5b69f7343103 100644 GIT binary patch delta 6214 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 delta 6804 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 +#include +#include + +#define pstruct struct __attribute__((packed)) + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + diff --git a/src/etc.h b/src/etc.h new file mode 100644 index 0000000..5eb4847 --- /dev/null +++ b/src/etc.h @@ -0,0 +1,12 @@ +#pragma once + +#include "common.h" + +void* memcpy(void* restrict dst, const void* src, size_t n); +void* memset(void* s, int c, size_t n); +void* memmove(void* dst, const void* src, size_t n); +int memcmp(const void* s1, const void* s2, size_t n); + +static int isprint(int ch) { + return (u8)(ch-' ') <= ('~'-' '); +} diff --git a/src/font.h b/src/font.h new file mode 100644 index 0000000..142a3fa --- /dev/null +++ b/src/font.h @@ -0,0 +1,124 @@ +#pragma once + +#include "common.h" + +/* credit due to blit-fonts + +ISC License +Copyright (c) 2018 Andrew Reece + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +*/ + +#define FONT_WIDTH 5 +#define FONT_HEIGHT 6 + +static u32 font[] = { + 0x0, + 0x8021084, + 0x294a, + 0x15f52bea, + 0x8fa38be, + 0x33a22e60, + 0x2e94d8a2, + 0x1084, + 0x10421088, + 0x4421082, + 0xa23880, + 0x471000, + 0x4420000, + 0x70000, + 0xc600000, + 0x2222200, + 0x1d3ad72e, + 0x3e4214c4, + 0x3e22222e, + 0x1d18320f, + 0x210fc888, + 0x1d183c3f, + 0x1d17844c, + 0x222221f, + 0x1d18ba2e, + 0x210f463e, + 0xc6018c0, + 0x4401000, + 0x10411100, + 0xe03800, + 0x4441040, + 0x802322e, + 0x3c1ef62e, + 0x231fc544, + 0x1f18be2f, + 0x3c10862e, + 0x1f18c62f, + 0x3e10bc3f, + 0x210bc3f, + 0x1d1c843e, + 0x2318fe31, + 0x3e42109f, + 0xc94211f, + 0x23149d31, + 0x3e108421, + 0x231ad6bb, + 0x239cd671, + 0x1d18c62e, + 0x217c62f, + 0x30eac62e, + 0x2297c62f, + 0x1d141a2e, + 0x842109f, + 0x1d18c631, + 0x8454631, + 0x375ad631, + 0x22a21151, + 0x8421151, + 0x3e22221f, + 0x1842108c, + 0x20820820, + 0xc421086, + 0x4544, + 0x3e000000, + 0x82, + 0x1c97b000, + 0xe949c21, + 0x1c10b800, + 0x1c94b908, + 0x1c549800, + 0x2211c4c, + 0xe87252e, + 0x12949c21, + 0xc210040, + 0x6210802, + 0x12519521, + 0xc210842, + 0x235aac00, + 0x12949c00, + 0xc949800, + 0x213a526, + 0x3087252e, + 0x2149800, + 0xe837000, + 0xc213c42, + 0xe94a400, + 0x464a400, + 0x155ac400, + 0x36426c00, + 0xe872529, + 0x1e223c00, + 0x1843188c, + 0x8421084, + 0xc463086, + 0x6d800, + 0x3fffffff, +}; diff --git a/src/int.c b/src/int.c index c9a249c..3620f31 100644 --- a/src/int.c +++ b/src/int.c @@ -1,15 +1,15 @@ #include -#define pstruct struct __attribute__((packed)) +#include "common.h" pstruct int_desc { - uint16_t addr_low; - uint16_t selector; - uint8_t ist; - uint8_t flags; - uint16_t addr_mid; - uint32_t addr_high; - uint32_t resv; + u16 addr_low; + u16 selector; + u8 ist; + u8 flags; + u16 addr_mid; + u32 addr_high; + u32 resv; }; enum INT_DESC_FLAGS { @@ -24,9 +24,9 @@ enum INT_DESC_FLAGS { struct int_desc idt[256]; -void set_idt(uint8_t vect, void* handler, uint8_t dpl) { +void set_idt(u8 vect, void* handler, u8 dpl) { struct int_desc* ent = &idt[vect]; - uint64_t addr = (uint64_t) handler; + u64 addr = (u64) handler; ent->addr_low = addr & 0xFFFF; ent->addr_mid = (addr >> 16) & 0xFFFF; ent->addr_mid = addr >> 32; @@ -37,8 +37,8 @@ void set_idt(uint8_t vect, void* handler, uint8_t dpl) { } pstruct idtr { - uint16_t limit; - uint64_t base; + u16 limit; + u64 base; }; #define IDTR_LIMIT (sizeof(struct int_desc)*256 - 1) @@ -46,25 +46,25 @@ pstruct idtr { void load_idt(void* addr) { struct idtr ir = (struct idtr) { .limit = IDTR_LIMIT, - .base = (uint64_t) addr, + .base = (u64) addr, }; asm volatile("lidt %0" :: "m"(ir)); } -extern void draw(uint8_t vect); +extern void draw(u8 vect); struct cpu_ctx { - uint64_t r15, r14, r13, r12, r11, r10, r9, r8, rdi, rsi, rdx, rcx, rbx, rax; + u64 r15, r14, r13, r12, r11, r10, r9, r8, rdi, rsi, rdx, rcx, rbx, rax; - uint64_t vect; - uint64_t err; + u64 vect; + u64 err; - uint64_t iret_rip; - uint64_t iret_cs; - uint64_t iret_flags; - uint64_t iret_rsp; - uint64_t iret_ss; + u64 iret_rip; + u64 iret_cs; + u64 iret_flags; + u64 iret_rsp; + u64 iret_ss; }; struct cpu_ctx* interrupt_dispatch(struct cpu_ctx* ctx) { diff --git a/src/main.c b/src/main.c index 2e75e1b..5100806 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,16 @@ #include #include #include -#include "../include/limine.h" -// credit owed to https://wiki.osdev.org/Limine_Bare_Bones + +#include "../include/limine.h" +#include "common.h" +#include "print.h" + +// credit owed to https://wiki.osdev.org/Limine_Bare_Bones for the limine setup code __attribute__((used, section(".limine_requests"))) -static volatile uint64_t limine_base_revision[] = LIMINE_BASE_REVISION(4); +static volatile u64 limine_base_revision[] = LIMINE_BASE_REVISION(4); __attribute__((used, section(".limine_requests"))) static volatile struct limine_framebuffer_request fb_req = { @@ -15,14 +19,14 @@ static volatile struct limine_framebuffer_request fb_req = { }; __attribute__((used, section(".limine_requests_start"))) -static volatile uint64_t limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER; +static volatile u64 limine_requests_start_marker[] = LIMINE_REQUESTS_START_MARKER; __attribute__((used, section(".limine_requests_end"))) -static volatile uint64_t limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER; +static volatile u64 limine_requests_end_marker[] = LIMINE_REQUESTS_END_MARKER; void* memcpy(void* restrict dst, const void* src, size_t n) { - uint8_t* restrict pdst = (uint8_t* restrict)dst; - const uint8_t* restrict psrc = (const uint8_t* restrict)src; + u8* restrict pdst = (u8* restrict)dst; + const u8* restrict psrc = (const u8* restrict)src; for(size_t i = 0; i < n; i++) { pdst[i] = psrc[i]; @@ -32,18 +36,18 @@ void* memcpy(void* restrict dst, const void* src, size_t n) { } void* memset(void* s, int c, size_t n) { - uint8_t* p = (uint8_t*) s; + u8* p = (u8*) s; for(size_t i = 0; i < n; i++) { - p[i] = (uint8_t)c; + p[i] = (u8)c; } return s; } void* memmove(void* dst, const void* src, size_t n) { - uint8_t* restrict pdst = (uint8_t* restrict)dst; - const uint8_t* restrict psrc = (const uint8_t* restrict)src; + u8* restrict pdst = (u8* restrict)dst; + const u8* restrict psrc = (const u8* restrict)src; if(src > dst) { for(size_t i = 0; i < n; i++) { @@ -59,8 +63,8 @@ void* memmove(void* dst, const void* src, size_t n) { } int memcmp(const void* s1, const void* s2, size_t n) { - const uint8_t* p1 = (const uint8_t* )s1; - const uint8_t* p2 = (const uint8_t* )s2; + const u8* p1 = (const u8* )s1; + const u8* p2 = (const u8* )s2; for(size_t i = 0; i < n; i++) { if(p1[i] != p2[i]) { @@ -80,10 +84,10 @@ static void hang() { struct limine_framebuffer* fb; -void draw(uint8_t vect) { +void draw(u8 vect) { for(size_t y = 0; y < fb->height; y++) { for(size_t x = 0; x < fb->width; x++) { - volatile uint32_t* fb_ptr = fb->address; + volatile u32* fb_ptr = fb->address; fb_ptr[y * fb->width + x] = ( (x + y) * 0x00010000 | (x ^ y) * 0x00000100 | @@ -108,11 +112,10 @@ void kmain() { init_idt(); - for(size_t i = 0; ~i & (1<<30); i++) { - draw(i&0xFF); - } + print_init(fb); + + print("TEST THIS\nMessage for me please Mr Kernel"); - hang(); } diff --git a/src/print.c b/src/print.c new file mode 100644 index 0000000..f071bd4 --- /dev/null +++ b/src/print.c @@ -0,0 +1,87 @@ +#include "etc.h" +#include "font.h" + +#include "../include/limine.h" + +u32 bg = 0x00000000; +u32 fg = 0xFFFFFFFF; +static size_t row; +static size_t col; +static size_t term_width, term_height; +static size_t fb_width, fb_height; +static volatile u32* fb_scr; + + +#define TAB_STOP 4 + +// buffer at each edge for readability +#define TERM_WIDTH (FONT_WIDTH+2) +#define TERM_HEIGHT (FONT_HEIGHT+2) + + +void print_init(struct limine_framebuffer* fb) { + term_width = fb->width / TERM_WIDTH; + term_height = fb->height / TERM_HEIGHT; + fb_width = fb->width; + fb_height = fb->height; + fb_scr = fb->address; +} + +static void scrollback() { + memmove((void*)fb_scr, (void*)(fb_scr + fb_width*TERM_HEIGHT), fb_width*(fb_height-1)*sizeof(u32)); +} + +void put(int ch) { + ch = (unsigned char)ch; + + if (!isprint(ch)) { + if (ch == '\n') { + col = 0; + row++; + } else if (ch == '\t') { + size_t target = (col + TAB_STOP) & ~(TAB_STOP - 1); + if (target >= term_width) { + col = 0; + row++; + } else { + while (col < target) + put(' '); + } + } + return; + } + + if (col >= term_width) { + col = 0; + row++; + } + + if (row >= term_height) { + scrollback(); + row = term_height - 1; + } + + size_t idx = ch - ' '; + u32 glyph = font[idx]; + + size_t px = col * TERM_WIDTH; + size_t py = row * TERM_HEIGHT; + + for (size_t y = 0; y < TERM_HEIGHT; y++) { + for (size_t x = 0; x < TERM_WIDTH; x++) { + size_t off = (py + y) * fb_width + (px + x); + bool padding = (y == 0 || y == TERM_HEIGHT-1 || x == 0 || x == TERM_WIDTH-1); + fb_scr[off] = ((~glyph & 1) | padding )? bg : (x^y * off + y*term_width); + glyph >>= !padding; + } + } + + col++; +} + + +void print(const char* msg) { + while(*msg) { + put(*(msg++)); + } +} diff --git a/src/print.h b/src/print.h new file mode 100644 index 0000000..d7dd1c2 --- /dev/null +++ b/src/print.h @@ -0,0 +1,10 @@ +#pragma once + + +struct limine_framebuffer; + +void put(int ch); + +void print(const char* msg); + +void print_init(struct limine_framebuffer* fb); diff --git a/src/rep.pl b/src/rep.pl new file mode 100644 index 0000000..13bce89 --- /dev/null +++ b/src/rep.pl @@ -0,0 +1,5 @@ +while(<>) { + s/\buint(..?)_t\b/u\1/g; + s/\bint(..?)_t\b/i\1/g; + print; +}