From 1dd56e1db65360f3f70661b0abe5a593438e0c09 Mon Sep 17 00:00:00 2001 From: "Hazal2.Veziroglu@live.uwe.ac.uk" <hazal2.veziroglu@live.uwe.ac.uk> Date: Fri, 6 Dec 2024 10:11:47 +0000 Subject: [PATCH] Update 9 files - /tiny-os/source/fb.c - /tiny-os/source/kernel.c - /tiny-os/source/io.c - /tiny-os/source/link.ld - /tiny-os/source/loader.asm - /tiny-os/source/fb.o - /tiny-os/source/loader.o - /tiny-os/source/io.o - /tiny-os/source/kernel.o --- tiny-os/source/fb.c | 37 +++++++++++++++++++++++++++++++++++++ tiny-os/source/fb.o | Bin 0 -> 1008 bytes tiny-os/source/io.c | 6 ++++++ tiny-os/source/io.o | Bin 0 -> 536 bytes tiny-os/source/kernel.c | 16 ++++++++++++++++ tiny-os/source/kernel.o | Bin 0 -> 868 bytes tiny-os/source/link.ld | 15 +++++++++++++++ tiny-os/source/loader.asm | 17 +++++++++++++++++ tiny-os/source/loader.o | Bin 0 -> 608 bytes 9 files changed, 91 insertions(+) create mode 100644 tiny-os/source/fb.c create mode 100644 tiny-os/source/fb.o create mode 100644 tiny-os/source/io.c create mode 100644 tiny-os/source/io.o create mode 100644 tiny-os/source/kernel.c create mode 100644 tiny-os/source/kernel.o create mode 100644 tiny-os/source/link.ld create mode 100644 tiny-os/source/loader.asm create mode 100644 tiny-os/source/loader.o diff --git a/tiny-os/source/fb.c b/tiny-os/source/fb.c new file mode 100644 index 0000000..b75f30a --- /dev/null +++ b/tiny-os/source/fb.c @@ -0,0 +1,37 @@ +#include "../include/fb.h" // Header file for framebuffer functions +#include "../include/io.h" // Include for outb function + +#define FB_COLS 80 // Number of columns in the framebuffer +#define FB_ROWS 25 // Number of rows in the framebuffer +#define FB_ADDR 0xB8000 // Starting address of the framebuffer + +// Function to clear the framebuffer +void fb_clear() { + char *fb = (char *)FB_ADDR; + for (int i = 0; i < FB_COLS * FB_ROWS; i++) { + fb[i * 2] = ' '; // Empty space + fb[i * 2 + 1] = 0x07; // Default color (white on black) + } +} + +// Function to print a string to the framebuffer at a specific location +void fb_print(const char *str, unsigned short row, unsigned short col) { + char *fb = (char *)FB_ADDR; + unsigned short pos = (row * FB_COLS + col) * 2; // Calculate position + + for (int i = 0; str[i] != '\0'; i++) { + fb[pos + i * 2] = str[i]; // Write character + fb[pos + i * 2 + 1] = 0x07; // Default color + } +} + +// Function to set the cursor position +void fb_move(unsigned short row, unsigned short col) { + unsigned short pos = row * FB_COLS + col; + + // Send the position to the VGA cursor registers + outb(0x3D4, 0x0F); // Low cursor byte + outb(0x3D5, (unsigned char)(pos & 0xFF)); + outb(0x3D4, 0x0E); // High cursor byte + outb(0x3D5, (unsigned char)((pos >> 8) & 0xFF)); +} diff --git a/tiny-os/source/fb.o b/tiny-os/source/fb.o new file mode 100644 index 0000000000000000000000000000000000000000..2f2b810f70b79fb02495e712d657f02db491f7a0 GIT binary patch literal 1008 zcmb<-^>JflWMqH=Mh0dE1doBCg9##I0;V(=I2kw?LOY)}zY#d@`h%f?o8h?YACS~* z<!;wMj0ZXob-Vsxyl{*`0nF_UV1)A7n_d4fHrD<*&(6S5cV)talZU~kNOXttbh`?q zb%wr4>vVkqHIsjP=$p<92OlsoUO4!GrSlN~cGnk-7Z?wub-I3o*=N}u`ls8KgYg3Y z_Rw$LzJC}`GM?(Z*d6+V@f80yh7KnF?XKUtL;o;dV!VLn3b@8?3@ryrcfj4E(H+Xs z?aGtZ8Turx)Aa%W_RuG2j(EU$0px_{Hyl~~8CRGY7+(DO|NnpU5dn~8{M!yRzu^eT zxQZkWQpty*GVS0C4s5C?oIK3n?(A%(pyBQps;OXTqGzOM018|*j2u5K3?KiqLFL^T z7#M^Y7#a8(7#Kk89w=Xefq~%?0|P@Rl&=6)526G>L|T$wGDBKYd~!}|ViAZ@P?VWh z0%GLmm!&e~mzE@flyNgMFfg$)FepQ5Qz#t>r5W^!D|1T{lNj`hONt<L28>mdnxj{e zT2aEFmy%eL$e@>0T+E=CoS&PUnpXlcn^-K*zyMC4Fh7IRWi(QNz?jku3=EtM3=9rX zgLRk~7(o68=>w@@VPIh3U|?WSg__3<Ro4%agt9>tjH?Y*Pe>gozCe0FG)O<lJYf(6 zia~NP49!|#nI()23<(Sj4D1XH3?Olk`#^C6@&n9HkU|zFh?_xd5C)kAq6HZk7?9QZ OFflM#f+V0ArVaqv4%r9* literal 0 HcmV?d00001 diff --git a/tiny-os/source/io.c b/tiny-os/source/io.c new file mode 100644 index 0000000..a2b731f --- /dev/null +++ b/tiny-os/source/io.c @@ -0,0 +1,6 @@ +#include "../include/io.h" + +// Function to send a byte to a specific hardware port +void outb(unsigned short port, unsigned char val) { + asm volatile ("outb %0, %1" : : "a"(val), "Nd"(port)); +} diff --git a/tiny-os/source/io.o b/tiny-os/source/io.o new file mode 100644 index 0000000000000000000000000000000000000000..3c958d2b55d271c55f1db8cb66b558a73a24701a GIT binary patch literal 536 zcmb<-^>JflWMqH=Mh0dE1doB?22{cXOlvT3Ft9U(c0O%>!_ghe(e28U)*1Sz!}SOM zHrF5g+e81nn{e_lgS)e{m4b%5U#O;np^2W6o&i`dDuHYV3&Y3%Y*1-=1_lNpkP9;N z^^zI#OG}a%81#xOb4wDF81#xuiXe0bj8&3aQNo~?l30?+pqEr!%%GQ?pPQSSR{}MS zFeS~v0J4n%W<SWEAUD8t!rZ9{RmTjK2!_%y3Z_n-fq{X8fq{XLIvuEau&@D{Ck!(T zDhDzXgqe`UGZ+{cKzcy#1&OmTFfa%(Ffec;*$GlUgMop88^nNOkU1cxAey?x3=9mW KAPFdjsRIBQO);_n literal 0 HcmV?d00001 diff --git a/tiny-os/source/kernel.c b/tiny-os/source/kernel.c new file mode 100644 index 0000000..9ff22ef --- /dev/null +++ b/tiny-os/source/kernel.c @@ -0,0 +1,16 @@ +#include "../include/fb.h" + +void kernel_main() { + // Clear the screen + fb_clear(); + + // Print messages using the framebuffer API + fb_print("Welcome to Tiny OS", 0, 0); // First row + fb_print("Framebuffer driver is working!", 1, 0); // Second row + + // Move the cursor to the third row + fb_move(2, 0); + + // Halt the CPU + while (1) {} +} diff --git a/tiny-os/source/kernel.o b/tiny-os/source/kernel.o new file mode 100644 index 0000000000000000000000000000000000000000..3eea2b44b3c8d8dfc8bf4fc8bbb6de451d50929c GIT binary patch literal 868 zcmb<-^>JflWMqH=Mh0dE1doB?3Y234R-nPa#lXoB+WEBk4abW=|NsAQe#4T*kj0Pz zl7$Ey5rBv>W{5B_Fd)P@vKX?MVBFXL!c%jS^K(-bO7ay#GV>}G{DT=7+=>!&Q<F;5 z(o%~QQi?LmQi~KaixtZAi?TEG(iIsP+?}1R6g1rZLNyf(P4tZP3_!M`VW@M#qAUy_ z|AQG&f|-GpfeXrZVPIeoVqjztgYrR?00RSqJct3sAif5a4WdANhV0a$ywn`MWGEv( zH!(AhAuTCBIVUx-2*fBT%FHVPF>>?EQW@A87#NsX7#M^Z7#J9t7#Ji#d{zbqbtqp4 z%C`p5Yzzzxdc~EwC5cH4dc`G05IO_KDoV}KD@m;=VbDuSEJ<Y0ODZmA&@0M^aFX+L zb5rw5K<*?KgZv5#FOan$J)k%Sg$sxc!XP;iEzQ8dz{$YC-~i$<Ffb%AGBAL`9^^NW z8Wsiy1`Y-W233%s7#J9sq3SB2G>ihN1+lfE>Ita>*#XkS1k%L7zyLDO7|I4wAbUZy z1=L=UdJum#10=jbY!C*S0mCq}K;j1&7#IqW+yXKW6vrUH!rTT@X8`pthz-IZvp}>U Tl3zjm35*O3jvxjU!_)x)T<~s4 literal 0 HcmV?d00001 diff --git a/tiny-os/source/link.ld b/tiny-os/source/link.ld new file mode 100644 index 0000000..0a0ade3 --- /dev/null +++ b/tiny-os/source/link.ld @@ -0,0 +1,15 @@ +ENTRY(loader) + +SECTIONS +{ + . = 0x100000; + + .text : { + *(.multiboot_header) + *(.text) + } + + .rodata : { *(.rodata) } + .data : { *(.data) } + .bss : { *(.bss) } +} diff --git a/tiny-os/source/loader.asm b/tiny-os/source/loader.asm new file mode 100644 index 0000000..4213733 --- /dev/null +++ b/tiny-os/source/loader.asm @@ -0,0 +1,17 @@ +global loader +extern kernel_main ; Declare the external C function + +section .text +align 4 + +MAGIC_NUMBER equ 0x1BADB002 +FLAGS equ 0x0 +CHECKSUM equ -MAGIC_NUMBER + +dd MAGIC_NUMBER +dd FLAGS +dd CHECKSUM + +loader: + call kernel_main ; Call the C function + hlt ; Halt if it returns diff --git a/tiny-os/source/loader.o b/tiny-os/source/loader.o new file mode 100644 index 0000000000000000000000000000000000000000..b9e7e9aa55b23c173d132449bcddbb2e2b3245f1 GIT binary patch literal 608 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpJY7?{8;QVEcmAj}5UXu!z8AOvNDC;<?` zz`(%Hz`(!^WrL^yMg|6L5Ce)qW`LN23=AkPX<%evXkcJqU}0cj0NDYeL1s##nFrG3 z1Tp}MVdg0^FfedJ#XwX569WSWR4+&k$UG3AX~SA+ko-UYpeHZ>{Qv*|3y6n=^-5AJ zN*MHtGm1-!N)nS8^olEUAvBa<l$rxkgQN+;1la}Su`qo64`YL9P|V1K{0(&j1H;Gv zIv@!+{`lXBfq?<!Hi*#2|H2Rkm;{A~H3I_!517ZmAOMQ#;{4L0<W&8f{KS;hBE7`o zT!!q_qP*0c_}s+IJO*D!cTeYdzffN%*B}NrA4m6K24@dfXYb%pUj~R4s97+I7vw%r H1V9A<)Ez$v literal 0 HcmV?d00001 -- GitLab