From 9384471535556c5a86d73171510f15bc5c9783be Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Tue, 26 Dec 2023 15:27:16 +0100 Subject: [PATCH] Added some docs and improved editor --- README.md | 36 +++++++++++++++++++++++++++++--- other/charset.png | Bin 0 -> 16714 bytes other/example.png | Bin 0 -> 41814 bytes other/logo.png | Bin 0 -> 6458 bytes src/boot.asm | 5 +++++ src/fs/calc.asm | 1 - src/fs/edit.asm | 52 +++++++++++++++++++++++++++++++--------------- src/kernel.asm | 15 +++++++------ src/lib/print.asm | 27 +++++++++++++++++++++++- test/test | 1 - test/test.asm | 5 ----- 11 files changed, 106 insertions(+), 36 deletions(-) create mode 100644 other/charset.png create mode 100644 other/example.png create mode 100644 other/logo.png delete mode 100644 test/test delete mode 100644 test/test.asm diff --git a/README.md b/README.md index a09b447..b76a5fa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,36 @@ # kern. +--- -This is a second version of Kern. -I am making this because idk how to make a filesystem in the original Kern. +Idk why i called it that it was 3am and i needed sleep -At some point i will probably make this repo Kern and the other one like an archive or something Idk \ No newline at end of file +## About +Kern is a 32-bit OS based on the x86 architecture written in NASM Assembly and C. + +It supports a basic command line and has a custom filesystem. + +_Note: The filesystem is currently a basic filetable._ + +## Usage +If you want to try kern for some reason, you can. +You might be able to find some releases, or build it using the build.sh script. + +For building, you'll need these tools: +- [NASM](https://www.nasm.us/) +- [QEMU](https://www.qemu.org/) (for emulation) + +I personally wouldn't recommend running this on real hardware, because it's untested and will just probably break you pc, but if you really want to, you can try it, but don't blame me if something goes wrong. + +If you don't know how to do something, try the 'help' command! + +## Some images + +The command prompt: \ +![CLI image](other/example.png) + +Built-in code editor: \ +![Code Editor](other/editor.png) + +Graphics mode test: \ +![Graphics Test](other/graphics.png) + +_These images may be outdated, Idk_ diff --git a/other/charset.png b/other/charset.png new file mode 100644 index 0000000000000000000000000000000000000000..d506abe816797d96d3b93048cae40dcc2869f606 GIT binary patch literal 16714 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 TpZa;=Pt>mH518*C`t-j6fhKe! literal 0 HcmV?d00001 diff --git a/other/logo.png b/other/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..53ffc6ef54ec887ed6e66805b91b636915e4d536 GIT binary patch literal 6458 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 ", 0 ; Prompt for input fileNotFoundMsg: db "File not found!", ENDL, 0 ; User tries to load nonexistent file -programLoadFailMsg: db "Failed while loading program!", ENDL, 0 ; File load fail +programLoadFailMsg: db "Couldn't load file!", ENDL, 0 ; File load fail sectorLenText: db "512B", 0 kilobyteText: db "kB", 0 oneHalfText: db ".5kB", 0 @@ -394,16 +393,16 @@ fileListMsg: db " Filename E# St Size ", ENDL, \ "---------- ------- ------", ENDL, 0 helpMsg: db "Available Commands:", ENDL, \ - "clear - Clears the screen", ENDL, \ - "gfx - Graphics mode test", ENDL, \ - "help - Prints this message", ENDL, \ - "ls - List all files", ENDL, \ - "reboot - Reboots the system", ENDL, 0 + " clear | Clears the screen", ENDL, \ + " edit | Opens the code editor", ENDL, \ + " gfx | Graphics mode test", ENDL, \ + " help | Prints this message", ENDL, \ + " ls | List all files", ENDL, \ + " reboot | Reboots the system", ENDL, ENDL, 0 ; Commands ; TODO: Put these into a file or something clearCmd: db "clear", 0 -editCmd: db "edit", 0 gfxCmd: db "gfx", 0 helpCmd: db "help", 0 lsCmd: db "ls", 0 diff --git a/src/lib/print.asm b/src/lib/print.asm index 034c4e1..1da7901 100644 --- a/src/lib/print.asm +++ b/src/lib/print.asm @@ -5,7 +5,7 @@ print: pusha mov ah, 0x0e - mov bl, 0x0f + mov bl, 0x1f mov bh, 0 .loop: lodsb ; Load [si] into al; Increment si @@ -53,6 +53,8 @@ printHex: printHexByte: pusha xor cx, cx + mov bh, 0 + mov bl, 0x1f ; White on blue .loop: mov al, dl and al, 0xF0 @@ -84,6 +86,29 @@ clear: popa ret +; +; Writes a string into video memory +; di - Video memory offset +; si - string +; +drawString: + pusha + push es ; For some reason doesn't get stored in pusha + mov ax, VIDMEM + mov es, ax +.loop: + cmp byte [si], 0 + je .after + movsb + mov byte [es:di], 0x1f ; White on blue + inc di + jmp .loop +.after: + pop es + popa + ret + ; Usefull definitions %define ENDL 0x0a, 0x0d +VIDMEM equ 0x0b800 newline: db ENDL, 0 ; CRLF diff --git a/test/test b/test/test deleted file mode 100644 index be55df0..0000000 --- a/test/test +++ /dev/null @@ -1 +0,0 @@ -¸AÍ1ÀÍÃ \ No newline at end of file diff --git a/test/test.asm b/test/test.asm deleted file mode 100644 index 7d10127..0000000 --- a/test/test.asm +++ /dev/null @@ -1,5 +0,0 @@ -mov ax, 0x0e41 -int 0x10 -xor ax, ax -int 0x16 -ret \ No newline at end of file