From b3087a2b64bdaf666efa0f539cefddf94ad18bfd Mon Sep 17 00:00:00 2001 From: Xircon Date: Wed, 6 May 2026 02:18:08 -0400 Subject: [PATCH] We work to earn the right to work over here... --- .ccls | 4 +- README.md | 3 +- build.aarch64 | 101 ++++++++++++ build.i686 | 18 +-- src/kernel/Makefile | 8 +- src/kernel/arch/aarch64/multiboot.arm | 21 +++ src/kernel/arch/i686/cpuid.asm | 1 + src/kernel/arch/i686/io.asm | 1 + src/kernel/arch/xtensa/entry.asm | 0 src/kernel/core/dma/dma.c | 3 +- src/kernel/core/dma/dma.h | 4 +- src/kernel/dri/keyboard.c | 74 ++++++++- src/kernel/dri/keyboard.h | 219 ++++++++++++++++++++++++++ src/kernel/main.c | 16 ++ src/kernel/nanstd.c | 20 ++- src/kernel/nanstd.h | 1 + src/kernel/stdbool.h | 11 ++ src/kernel/stdint.h | 39 +++++ src/kernel/stdio.c | 68 ++++++++ src/kernel/stdio.h | 3 +- src/kernel/stdlib.c | 26 +++ src/kernel/stdlib.h | 12 ++ src/kernel/version.h | 2 +- 23 files changed, 631 insertions(+), 24 deletions(-) create mode 100755 build.aarch64 create mode 100644 src/kernel/arch/aarch64/multiboot.arm create mode 100644 src/kernel/arch/xtensa/entry.asm create mode 100644 src/kernel/stdbool.h create mode 100644 src/kernel/stdint.h create mode 100644 src/kernel/stdlib.c create mode 100644 src/kernel/stdlib.h diff --git a/.ccls b/.ccls index d5a060c..2385297 100644 --- a/.ccls +++ b/.ccls @@ -3,4 +3,6 @@ clang %c -isystem./src/kernel/ %c -fno-builtin %c -D__I686 -%c -D__XTENSA \ No newline at end of file +%c -D__XTENSA +%c -D__AARCH64 +%c -D__LAYOUT_QWERTY \ No newline at end of file diff --git a/README.md b/README.md index f712b89..8b384aa 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,8 @@ Serial is mostly used as a debug output (In the future this will be able to be e #### Note: Kernel is currently under very heavy development. All things are subject to change at any time. ## Building -Run `./build.i686` inside main directory of repo, however you may first need to run `make toolchain TARGET=i686-elf` (you can also build for `xtensa-esp32-elf`) i would DEFINITELY use more than one job (building GCC takes forever) +Run `./build.i686` inside main directory of repo, however you may first need to run `make toolchain TARGET=i686-elf` (you can also build for `armv7-elf`) i would DEFINITELY use more than one job (building GCC takes forever) +Theres also Xtensa Support being worked on, but its currently non-functional To write to a disk, use `./write.sh` just enter a disk in at the prompt and it will build & flash nanite to it (ex. `/dev/sdb`) You could also run `make all` but the scripts a bit better tbh, it even automates starting QEMU and building an image. diff --git a/build.aarch64 b/build.aarch64 new file mode 100755 index 0000000..fa47536 --- /dev/null +++ b/build.aarch64 @@ -0,0 +1,101 @@ +#!/bin/bash +echo -------- +echo STARTING +echo -------- +read -p "Do you want to clean old build files? (y/n) " yn + +case $yn in + y ) + + echo ---------------------------; + echo Removing Old Build Files...; + echo ---------------------------; + + make -j24 clean; + echo -----; + echo Done!; + echo -----; + ;; + n ) + echo ---------; + echo Proceding; + echo ---------; + ;; +esac +echo ------------ +echo COMPILING OS +echo ------------ + +make TARGET=aarch64-elf TARGET_DEFINE=__AARCH64 TARGET_ASM=aarch64-elf-as -j24 -s + +echo --------- +echo Finished! +echo --------- +read -p "Do you want to make to make a bootable image? [Requires sudo] (y/n) " yn +case $yn in + y) + echo ---------------- + echo Installing GRUB! + echo ---------------- + + sudo losetup -d /dev/loop969 + dd if=/dev/zero of=build/main.img bs=512 count=50000 + mkdir -p build/mnt + sudo losetup -P /dev/loop969 build/main.img + sudo parted /dev/loop969 mktable msdos + sudo parted /dev/loop969 mkpart primary fat16 2048s 100% + sudo parted /dev/loop969p1 set 1 boot on + sudo mkfs.fat -F16 /dev/loop969p1 + sudo mount /dev/loop969p1 build/mnt + sudo mkdir build/mnt/boot + sudo mkdir build/mnt/boot/grub + sudo mkdir build/mnt/misc + sudo mkdir build/mnt/misc/src + sudo cp -r src/* build/mnt/src + sudo cp -r grub/* build/mnt/boot/grub + sudo cp build/nanite.bin build/mnt/boot/nanite + sudo grub-install \ + --install-modules="part_msdos gettext all_video gfxterm png normal echo multiboot2" \ + --boot-directory=build/mnt/boot \ + --target=i386-pc \ + --bootloader-id=GRUB \ + /dev/loop969 -v + sudo umount build/mnt + sudo losetup -d /dev/loop969 + + ;; + n ) echo exiting...; + exit;; + * ) echo invalid response; + exit 1;; +esac +echo --------- +echo Finished! +echo --------- + +read -p "Do you want to Start QEMU? (y/n) " yn + +case $yn in + y ) + echo ------------- + echo STARTING QEMU + echo ------------- + qemu-system-i386 \ + -chardev pty,id=serial1 \ + -serial mon:stdio \ + -serial chardev:serial1 \ + -audiodev pa,id=speaker \ + -machine pcspk-audiodev=speaker \ + -hda build/main.img \ + -m size=16M + echo -------- + echo Finshed! + echo -------- + + ;; + n ) echo exiting...; + exit;; + * ) echo invalid response; + exit 1;; +esac + diff --git a/build.i686 b/build.i686 index 41531a8..86ad1b0 100755 --- a/build.i686 +++ b/build.i686 @@ -38,15 +38,15 @@ case $yn in echo Installing GRUB! echo ---------------- - sudo losetup -d /dev/loop969 + sudo losetup -d /dev/loop900 dd if=/dev/zero of=build/main.img bs=512 count=50000 mkdir -p build/mnt - sudo losetup -P /dev/loop969 build/main.img - sudo parted /dev/loop969 mktable msdos - sudo parted /dev/loop969 mkpart primary fat16 2048s 100% - sudo parted /dev/loop969p1 set 1 boot on - sudo mkfs.fat -F16 /dev/loop969p1 - sudo mount /dev/loop969p1 build/mnt + sudo losetup -P /dev/loop900 build/main.img + sudo parted /dev/loop900 mktable msdos + sudo parted /dev/loop900 mkpart primary fat16 2048s 100% + sudo parted /dev/loop900p1 set 1 boot on + sudo mkfs.fat -F16 /dev/loop900p1 + sudo mount /dev/loop900p1 build/mnt sudo mkdir build/mnt/boot sudo mkdir build/mnt/boot/grub sudo mkdir build/mnt/misc @@ -59,9 +59,9 @@ case $yn in --boot-directory=build/mnt/boot \ --target=i386-pc \ --bootloader-id=GRUB \ - /dev/loop969 -v + /dev/loop900 -v sudo umount build/mnt - sudo losetup -d /dev/loop969 + sudo losetup -d /dev/loop900 ;; n ) echo exiting...; diff --git a/src/kernel/Makefile b/src/kernel/Makefile index 5454780..bc1662f 100644 --- a/src/kernel/Makefile +++ b/src/kernel/Makefile @@ -1,6 +1,7 @@ TARGET_DEFINE = __I686 +KEYBOARD_LAYOUT = QWERTY TARGET_ASMFLAGS += -f elf -TARGET_CFLAGS += -ffreestanding -nostdlib -I. -D$(TARGET_DEFINE) +TARGET_CFLAGS += -ffreestanding -nostdlib -I. -D$(TARGET_DEFINE) -D__LAYOUT_$(KEYBOARD_LAYOUT) TARGET_LIBS += -lgcc TARGET_LINKFLAGS += -T linker.ld -nostdlib @@ -25,7 +26,12 @@ SOURCES_ASM_i686-elf = $(wildcard arch/i686/*.asm) HEADERS_ASM_xtensa-esp32-elf = $(wildcard arch/xtensa/*.inc) SOURCES_ASM_xtensa-esp32-elf = $(wildcard arch/xtensa/*.asm) +HEADERS_ASM_aarch64-elf = $(wildcard arch/aarch64/*.inc) +SOURCES_ASM_aarch64-elf = $(wildcard arch/aarch64/*.arm) + # TWO ARCHITECTURES! HAHAHAHAH +# Xtensa is not gonna be touched for a bit ngl +# once i buy a pile of ESP32s it will be tho OBJECTS_ASM = $(patsubst %.asm, $(BUILD_DIR)/kernel/asm/%.obj, $(SOURCES_ASM_$(TARGET))) diff --git a/src/kernel/arch/aarch64/multiboot.arm b/src/kernel/arch/aarch64/multiboot.arm new file mode 100644 index 0000000..270f2aa --- /dev/null +++ b/src/kernel/arch/aarch64/multiboot.arm @@ -0,0 +1,21 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2026| +|Xircon | +\*----------------*/ + +.sect ".multiboot" +header_start: + .long 0xe85250d6 // magic number + .long 0 // protected mode code + .long header_end - header_start // header length + .long 0x100000000 - (0xe85250d6 + 0 + (header_end - header_start)) // checksum + // required end tag + .long 6 // type + .long 0 // flags + .long 8 // size +header_end: + +.sect ".boot" +_start: + bl start \ No newline at end of file diff --git a/src/kernel/arch/i686/cpuid.asm b/src/kernel/arch/i686/cpuid.asm index 839a899..7f719f6 100644 --- a/src/kernel/arch/i686/cpuid.asm +++ b/src/kernel/arch/i686/cpuid.asm @@ -3,6 +3,7 @@ ;COPYRIGHT (C) 2026 ; ;Xircon ; ;/////////////////////; +[bits 32] global CPUID_Check_Supported CPUID_Check_Supported: diff --git a/src/kernel/arch/i686/io.asm b/src/kernel/arch/i686/io.asm index 6d25cff..78b2bd4 100644 --- a/src/kernel/arch/i686/io.asm +++ b/src/kernel/arch/i686/io.asm @@ -3,6 +3,7 @@ ;COPYRIGHT (C) 2026 ; ;Xircon ; ;/////////////////////; +[bits 32] global outb outb: diff --git a/src/kernel/arch/xtensa/entry.asm b/src/kernel/arch/xtensa/entry.asm new file mode 100644 index 0000000..e69de29 diff --git a/src/kernel/core/dma/dma.c b/src/kernel/core/dma/dma.c index b362d1f..12affc8 100644 --- a/src/kernel/core/dma/dma.c +++ b/src/kernel/core/dma/dma.c @@ -7,7 +7,7 @@ #ifdef __I686 #include -#endif + #include #include @@ -156,3 +156,4 @@ bool DMA_Init_Floppy(uint8_t* buffer, unsigned length) return true; } +#endif \ No newline at end of file diff --git a/src/kernel/core/dma/dma.h b/src/kernel/core/dma/dma.h index 731c62f..13f4b42 100644 --- a/src/kernel/core/dma/dma.h +++ b/src/kernel/core/dma/dma.h @@ -5,6 +5,7 @@ \*----------------*/ #pragma once +#ifdef __I686 #include #include @@ -118,4 +119,5 @@ enum DMA_MODE_REG_MASK { DMA_MODE_TRANSFER_SINGLE = 0x40, DMA_MODE_TRANSFER_BLOCK = 0x80, DMA_MODE_TRANSFER_CASCADE = 0xC0 -}; \ No newline at end of file +}; +#endif \ No newline at end of file diff --git a/src/kernel/dri/keyboard.c b/src/kernel/dri/keyboard.c index 969f008..94d7787 100644 --- a/src/kernel/dri/keyboard.c +++ b/src/kernel/dri/keyboard.c @@ -21,7 +21,7 @@ bool _keyboard_disable; // True if keyboard is disabled, false if not bool _numlock, _capslock, _scrolllock; // Is true when toggeld bool _ctrl, _alt, _shift; // True if pressed -uint8_t _keyboard_scancode; // Buffer for keyboard's Scancodes +uint8_t _keyboard_scancode = 0; // Buffer for keyboard's Scancodes extern uint16_t DEBUG_COM_PORT; @@ -138,3 +138,75 @@ void Keyboard_Init() _shift = _alt = _ctrl = false; } +char kscan() { + switch(_keyboard_scancode) { + case KEYBOARD_LAYOUT_OEM_3: return '`'; + case KEYBOARD_LAYOUT_1: return '1'; + case KEYBOARD_LAYOUT_2: return '2'; + case KEYBOARD_LAYOUT_3: return '3'; + case KEYBOARD_LAYOUT_4: return '4'; + case KEYBOARD_LAYOUT_5: return '5'; + case KEYBOARD_LAYOUT_6: return '6'; + case KEYBOARD_LAYOUT_7: return '7'; + case KEYBOARD_LAYOUT_8: return '8'; + case KEYBOARD_LAYOUT_9: return '9'; + case KEYBOARD_LAYOUT_0: return '0'; + case KEYBOARD_LAYOUT_OEM_MI: return '-'; + case KEYBOARD_LAYOUT_OEM_PL: return '='; + case KEYBOARD_LAYOUT_BACK: return '\b'; + case KEYBOARD_LAYOUT_TAB: return '\t'; + case KEYBOARD_LAYOUT_Q: return 'Q'; + case KEYBOARD_LAYOUT_W: return 'W'; + case KEYBOARD_LAYOUT_E: return 'E'; + case KEYBOARD_LAYOUT_R: return 'R'; + case KEYBOARD_LAYOUT_T: return 'T'; + case KEYBOARD_LAYOUT_Y: return 'Y'; + case KEYBOARD_LAYOUT_U: return 'U'; + case KEYBOARD_LAYOUT_I: return 'I'; + case KEYBOARD_LAYOUT_O: return 'O'; + case KEYBOARD_LAYOUT_P: return 'P'; + case KEYBOARD_LAYOUT_OEM_4: return '['; + case KEYBOARD_LAYOUT_OEM_6: return ']'; + case KEYBOARD_LAYOUT_OEM_5: return '\\'; + case KEYBOARD_LAYOUT_A: return 'A'; + case KEYBOARD_LAYOUT_S: return 'S'; + case KEYBOARD_LAYOUT_D: return 'D'; + case KEYBOARD_LAYOUT_F: return 'F'; + case KEYBOARD_LAYOUT_G: return 'G'; + case KEYBOARD_LAYOUT_H: return 'H'; + case KEYBOARD_LAYOUT_J: return 'J'; + case KEYBOARD_LAYOUT_K: return 'K'; + case KEYBOARD_LAYOUT_L: return 'L'; + case KEYBOARD_LAYOUT_OEM_1: return ';'; + case KEYBOARD_LAYOUT_OEM_7: return '\''; + case KEYBOARD_LAYOUT_RETURN: return '\n'; + case KEYBOARD_LAYOUT_Z: return 'Z'; + case KEYBOARD_LAYOUT_X: return 'X'; + case KEYBOARD_LAYOUT_C: return 'C'; + case KEYBOARD_LAYOUT_V: return 'V'; + case KEYBOARD_LAYOUT_B: return 'B'; + case KEYBOARD_LAYOUT_N: return 'N'; + case KEYBOARD_LAYOUT_M: return 'M'; + case KEYBOARD_LAYOUT_OEM_CC: return ','; + case KEYBOARD_LAYOUT_OEM_PE: return '.'; + case KEYBOARD_LAYOUT_OEM_2: return '/'; + case KEYBOARD_LAYOUT_SPACE: return ' '; + case KEYBOARD_LAYOUT_DIVIDE: return '/'; + case KEYBOARD_LAYOUT_MULTIPLY: return '*'; + case KEYBOARD_LAYOUT_SUBTRACT: return '-'; + case KEYBOARD_LAYOUT_NUMPAD_1: return '1'; + case KEYBOARD_LAYOUT_NUMPAD_2: return '2'; + case KEYBOARD_LAYOUT_NUMPAD_3: return '3'; + case KEYBOARD_LAYOUT_NUMPAD_4: return '4'; + case KEYBOARD_LAYOUT_NUMPAD_5: return '5'; + case KEYBOARD_LAYOUT_NUMPAD_6: return '6'; + case KEYBOARD_LAYOUT_NUMPAD_7: return '7'; + case KEYBOARD_LAYOUT_NUMPAD_8: return '8'; + case KEYBOARD_LAYOUT_NUMPAD_9: return '9'; + case KEYBOARD_LAYOUT_NUMPAD_0: return '0'; + case KEYBOARD_LAYOUT_NUMPAD_PERIOD: return '.'; + case KEYBOARD_LAYOUT_ADD: return '+'; + case KEYBOARD_LAYOUT_NUMPAD_RETURN: return '\n'; + default: return '\0'; + } +} diff --git a/src/kernel/dri/keyboard.h b/src/kernel/dri/keyboard.h index 906b8fe..04034fd 100644 --- a/src/kernel/dri/keyboard.h +++ b/src/kernel/dri/keyboard.h @@ -19,6 +19,7 @@ void Keyboard_Controller_Send_Command(uint8_t command); uint8_t Keyboard_Controller_Status(); uint8_t Keyboard_Read_Encoder_Buffer(); bool Keyboard_Self_Test(); +char kscan(); @@ -58,3 +59,221 @@ enum KEYBOARD_ENC_CMD { KEYBOARD_ENC_CMD_SET_LED = 0xED }; + +enum KEYBOARD_LAYOUT_QWERTY { + KEYBOARD_LAYOUT_QWERTY_ESCAPE = 0x01, + KEYBOARD_LAYOUT_QWERTY_F1 = 0x3B, + KEYBOARD_LAYOUT_QWERTY_F2 = 0x3C, + KEYBOARD_LAYOUT_QWERTY_F3 = 0x3D, + KEYBOARD_LAYOUT_QWERTY_F4 = 0x3E, + KEYBOARD_LAYOUT_QWERTY_F5 = 0x3F, + KEYBOARD_LAYOUT_QWERTY_F6 = 0x40, + KEYBOARD_LAYOUT_QWERTY_F7 = 0x41, + KEYBOARD_LAYOUT_QWERTY_F8 = 0x42, + KEYBOARD_LAYOUT_QWERTY_F9 = 0x43, + KEYBOARD_LAYOUT_QWERTY_F10 = 0x44, + KEYBOARD_LAYOUT_QWERTY_F11 = 0x57, + KEYBOARD_LAYOUT_QWERTY_F12 = 0x58, + KEYBOARD_LAYOUT_QWERTY_SNAPSHOT = 0x54, + KEYBOARD_LAYOUT_QWERTY_SCROLL = 0x46, + KEYBOARD_LAYOUT_QWERTY_PAUSE = 0xE1D1, + KEYBOARD_LAYOUT_QWERTY_OEM_3 = 0x29, + KEYBOARD_LAYOUT_QWERTY_1 = 0x02, + KEYBOARD_LAYOUT_QWERTY_2 = 0x03, + KEYBOARD_LAYOUT_QWERTY_3 = 0x04, + KEYBOARD_LAYOUT_QWERTY_4 = 0x05, + KEYBOARD_LAYOUT_QWERTY_5 = 0x06, + KEYBOARD_LAYOUT_QWERTY_6 = 0x07, + KEYBOARD_LAYOUT_QWERTY_7 = 0x08, + KEYBOARD_LAYOUT_QWERTY_8 = 0x09, + KEYBOARD_LAYOUT_QWERTY_9 = 0x0A, + KEYBOARD_LAYOUT_QWERTY_0 = 0x0B, + KEYBOARD_LAYOUT_QWERTY_OEM_MI = 0x0C, + KEYBOARD_LAYOUT_QWERTY_OEM_PL = 0x0D, + KEYBOARD_LAYOUT_QWERTY_BACK = 0x0E, + KEYBOARD_LAYOUT_QWERTY_TAB = 0x0F, + KEYBOARD_LAYOUT_QWERTY_Q = 0x10, + KEYBOARD_LAYOUT_QWERTY_W = 0x11, + KEYBOARD_LAYOUT_QWERTY_E = 0x12, + KEYBOARD_LAYOUT_QWERTY_R = 0x13, + KEYBOARD_LAYOUT_QWERTY_T = 0x14, + KEYBOARD_LAYOUT_QWERTY_Y = 0x15, + KEYBOARD_LAYOUT_QWERTY_U = 0x16, + KEYBOARD_LAYOUT_QWERTY_I = 0x17, + KEYBOARD_LAYOUT_QWERTY_O = 0x18, + KEYBOARD_LAYOUT_QWERTY_P = 0x19, + KEYBOARD_LAYOUT_QWERTY_OEM_4 = 0x1A, + KEYBOARD_LAYOUT_QWERTY_OEM_6 = 0x1B, + KEYBOARD_LAYOUT_QWERTY_OEM_5 = 0x2B, + KEYBOARD_LAYOUT_QWERTY_CAPITAL = 0x3A, + KEYBOARD_LAYOUT_QWERTY_A = 0x1E, + KEYBOARD_LAYOUT_QWERTY_S = 0x1F, + KEYBOARD_LAYOUT_QWERTY_D = 0x20, + KEYBOARD_LAYOUT_QWERTY_F = 0x21, + KEYBOARD_LAYOUT_QWERTY_G = 0x22, + KEYBOARD_LAYOUT_QWERTY_H = 0x23, + KEYBOARD_LAYOUT_QWERTY_J = 0x24, + KEYBOARD_LAYOUT_QWERTY_K = 0x25, + KEYBOARD_LAYOUT_QWERTY_L = 0x26, + KEYBOARD_LAYOUT_QWERTY_OEM_1 = 0x27, + KEYBOARD_LAYOUT_QWERTY_OEM_7 = 0x28, + KEYBOARD_LAYOUT_QWERTY_RETURN = 0x1C, + KEYBOARD_LAYOUT_QWERTY_LSHIFT = 0x2A, + KEYBOARD_LAYOUT_QWERTY_Z = 0x2C, + KEYBOARD_LAYOUT_QWERTY_X = 0x2D, + KEYBOARD_LAYOUT_QWERTY_C = 0x2E, + KEYBOARD_LAYOUT_QWERTY_V = 0x2F, + KEYBOARD_LAYOUT_QWERTY_B = 0x30, + KEYBOARD_LAYOUT_QWERTY_N = 0x31, + KEYBOARD_LAYOUT_QWERTY_M = 0x32, + KEYBOARD_LAYOUT_QWERTY_OEM_CC = 0x33, + KEYBOARD_LAYOUT_QWERTY_OEM_PE = 0x34, + KEYBOARD_LAYOUT_QWERTY_OEM_2 = 0x35, + KEYBOARD_LAYOUT_QWERTY_RSHIFT = 0x36, + KEYBOARD_LAYOUT_QWERTY_LCONTROL = 0x1D, + KEYBOARD_LAYOUT_QWERTY_LSUPER = 0xE05B, + KEYBOARD_LAYOUT_QWERTY_LMENU = 0x38, + KEYBOARD_LAYOUT_QWERTY_SPACE = 0x39, + KEYBOARD_LAYOUT_QWERTY_RMENU = 0xE038, + KEYBOARD_LAYOUT_QWERTY_RSUPER = 0xE05C, + KEYBOARD_LAYOUT_QWERTY_APPS = 0xE05D, + KEYBOARD_LAYOUT_QWERTY_RCONTROL = 0xE01D, + KEYBOARD_LAYOUT_QWERTY_INSERT = 0xE052, + KEYBOARD_LAYOUT_QWERTY_HOME = 0xE047, + KEYBOARD_LAYOUT_QWERTY_PRIOR = 0xE049, + KEYBOARD_LAYOUT_QWERTY_DELETE = 0xE053, + KEYBOARD_LAYOUT_QWERTY_END = 0xE04F, + KEYBOARD_LAYOUT_QWERTY_NEXT = 0xE051, + KEYBOARD_LAYOUT_QWERTY_UP = 0xE048, + KEYBOARD_LAYOUT_QWERTY_LEFT = 0xE04B, + KEYBOARD_LAYOUT_QWERTY_RIGHT = 0xE04D, + KEYBOARD_LAYOUT_QWERTY_DOWN = 0xE050, + KEYBOARD_LAYOUT_QWERTY_NUMLOCK = 0x45, + KEYBOARD_LAYOUT_QWERTY_DIVIDE = 0xE035, + KEYBOARD_LAYOUT_QWERTY_MULTIPLY = 0x37, + KEYBOARD_LAYOUT_QWERTY_SUBTRACT = 0x4A, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_1 = 0x47, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_2 = 0x48, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_3 = 0x49, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_4 = 0x4B, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_5 = 0x4C, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_6 = 0x4D, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_7 = 0x4F, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_8 = 0x50, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_9 = 0x51, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_0 = 0x52, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_PERIOD = 0x53, + KEYBOARD_LAYOUT_QWERTY_ADD = 0x4E, + KEYBOARD_LAYOUT_QWERTY_NUMPAD_RETURN = 0xE01, +}; + +#ifdef __LAYOUT_QWERTY + +enum KEYBOARD_LAYOUT { + KEYBOARD_LAYOUT_ESCAPE = KEYBOARD_LAYOUT_QWERTY_ESCAPE, + KEYBOARD_LAYOUT_F1 = KEYBOARD_LAYOUT_QWERTY_F1, + KEYBOARD_LAYOUT_F2 = KEYBOARD_LAYOUT_QWERTY_F2, + KEYBOARD_LAYOUT_F3 = KEYBOARD_LAYOUT_QWERTY_F3, + KEYBOARD_LAYOUT_F4 = KEYBOARD_LAYOUT_QWERTY_F4, + KEYBOARD_LAYOUT_F5 = KEYBOARD_LAYOUT_QWERTY_F5, + KEYBOARD_LAYOUT_F6 = KEYBOARD_LAYOUT_QWERTY_F6, + KEYBOARD_LAYOUT_F7 = KEYBOARD_LAYOUT_QWERTY_F7, + KEYBOARD_LAYOUT_F8 = KEYBOARD_LAYOUT_QWERTY_F8, + KEYBOARD_LAYOUT_F9 = KEYBOARD_LAYOUT_QWERTY_F9, + KEYBOARD_LAYOUT_F10 = KEYBOARD_LAYOUT_QWERTY_F10, + KEYBOARD_LAYOUT_F11 = KEYBOARD_LAYOUT_QWERTY_F11, + KEYBOARD_LAYOUT_F12 = KEYBOARD_LAYOUT_QWERTY_F12, + KEYBOARD_LAYOUT_SNAPSHOT = KEYBOARD_LAYOUT_QWERTY_SNAPSHOT, + KEYBOARD_LAYOUT_SCROLL = KEYBOARD_LAYOUT_QWERTY_SCROLL, + KEYBOARD_LAYOUT_PAUSE = KEYBOARD_LAYOUT_QWERTY_PAUSE, + KEYBOARD_LAYOUT_OEM_3 = KEYBOARD_LAYOUT_QWERTY_OEM_3, + KEYBOARD_LAYOUT_1 = KEYBOARD_LAYOUT_QWERTY_1, + KEYBOARD_LAYOUT_2 = KEYBOARD_LAYOUT_QWERTY_2, + KEYBOARD_LAYOUT_3 = KEYBOARD_LAYOUT_QWERTY_3, + KEYBOARD_LAYOUT_4 = KEYBOARD_LAYOUT_QWERTY_4, + KEYBOARD_LAYOUT_5 = KEYBOARD_LAYOUT_QWERTY_5, + KEYBOARD_LAYOUT_6 = KEYBOARD_LAYOUT_QWERTY_6, + KEYBOARD_LAYOUT_7 = KEYBOARD_LAYOUT_QWERTY_7, + KEYBOARD_LAYOUT_8 = KEYBOARD_LAYOUT_QWERTY_8, + KEYBOARD_LAYOUT_9 = KEYBOARD_LAYOUT_QWERTY_9, + KEYBOARD_LAYOUT_0 = KEYBOARD_LAYOUT_QWERTY_0, + KEYBOARD_LAYOUT_OEM_MI = KEYBOARD_LAYOUT_QWERTY_OEM_MI, + KEYBOARD_LAYOUT_OEM_PL = KEYBOARD_LAYOUT_QWERTY_OEM_PL, + KEYBOARD_LAYOUT_BACK = KEYBOARD_LAYOUT_QWERTY_BACK, + KEYBOARD_LAYOUT_TAB = KEYBOARD_LAYOUT_QWERTY_TAB, + KEYBOARD_LAYOUT_Q = KEYBOARD_LAYOUT_QWERTY_Q, + KEYBOARD_LAYOUT_W = KEYBOARD_LAYOUT_QWERTY_W, + KEYBOARD_LAYOUT_E = KEYBOARD_LAYOUT_QWERTY_E, + KEYBOARD_LAYOUT_R = KEYBOARD_LAYOUT_QWERTY_R, + KEYBOARD_LAYOUT_T = KEYBOARD_LAYOUT_QWERTY_T, + KEYBOARD_LAYOUT_Y = KEYBOARD_LAYOUT_QWERTY_Y, + KEYBOARD_LAYOUT_U = KEYBOARD_LAYOUT_QWERTY_U, + KEYBOARD_LAYOUT_I = KEYBOARD_LAYOUT_QWERTY_I, + KEYBOARD_LAYOUT_O = KEYBOARD_LAYOUT_QWERTY_O, + KEYBOARD_LAYOUT_P = KEYBOARD_LAYOUT_QWERTY_P, + KEYBOARD_LAYOUT_OEM_4 = KEYBOARD_LAYOUT_QWERTY_OEM_4, + KEYBOARD_LAYOUT_OEM_6 = KEYBOARD_LAYOUT_QWERTY_OEM_6, + KEYBOARD_LAYOUT_OEM_5 = KEYBOARD_LAYOUT_QWERTY_OEM_5, + KEYBOARD_LAYOUT_CAPITAL = KEYBOARD_LAYOUT_QWERTY_CAPITAL, + KEYBOARD_LAYOUT_A = KEYBOARD_LAYOUT_QWERTY_A, + KEYBOARD_LAYOUT_S = KEYBOARD_LAYOUT_QWERTY_S, + KEYBOARD_LAYOUT_D = KEYBOARD_LAYOUT_QWERTY_D, + KEYBOARD_LAYOUT_F = KEYBOARD_LAYOUT_QWERTY_F, + KEYBOARD_LAYOUT_G = KEYBOARD_LAYOUT_QWERTY_G, + KEYBOARD_LAYOUT_H = KEYBOARD_LAYOUT_QWERTY_H, + KEYBOARD_LAYOUT_J = KEYBOARD_LAYOUT_QWERTY_J, + KEYBOARD_LAYOUT_K = KEYBOARD_LAYOUT_QWERTY_K, + KEYBOARD_LAYOUT_L = KEYBOARD_LAYOUT_QWERTY_L, + KEYBOARD_LAYOUT_OEM_1 = KEYBOARD_LAYOUT_QWERTY_OEM_1, + KEYBOARD_LAYOUT_OEM_7 = KEYBOARD_LAYOUT_QWERTY_OEM_7, + KEYBOARD_LAYOUT_RETURN = KEYBOARD_LAYOUT_QWERTY_RETURN, + KEYBOARD_LAYOUT_LSHIFT = KEYBOARD_LAYOUT_QWERTY_LSHIFT, + KEYBOARD_LAYOUT_Z = KEYBOARD_LAYOUT_QWERTY_Z, + KEYBOARD_LAYOUT_X = KEYBOARD_LAYOUT_QWERTY_X, + KEYBOARD_LAYOUT_C = KEYBOARD_LAYOUT_QWERTY_C, + KEYBOARD_LAYOUT_V = KEYBOARD_LAYOUT_QWERTY_V, + KEYBOARD_LAYOUT_B = KEYBOARD_LAYOUT_QWERTY_B, + KEYBOARD_LAYOUT_N = KEYBOARD_LAYOUT_QWERTY_N, + KEYBOARD_LAYOUT_M = KEYBOARD_LAYOUT_QWERTY_M, + KEYBOARD_LAYOUT_OEM_CC = KEYBOARD_LAYOUT_QWERTY_OEM_CC, + KEYBOARD_LAYOUT_OEM_PE = KEYBOARD_LAYOUT_QWERTY_OEM_PE, + KEYBOARD_LAYOUT_OEM_2 = KEYBOARD_LAYOUT_QWERTY_OEM_2, + KEYBOARD_LAYOUT_RSHIFT = KEYBOARD_LAYOUT_QWERTY_RSHIFT, + KEYBOARD_LAYOUT_LCONTROL = KEYBOARD_LAYOUT_QWERTY_LCONTROL, + KEYBOARD_LAYOUT_LSUPER = KEYBOARD_LAYOUT_QWERTY_LSUPER, + KEYBOARD_LAYOUT_LMENU = KEYBOARD_LAYOUT_QWERTY_LMENU, + KEYBOARD_LAYOUT_SPACE = KEYBOARD_LAYOUT_QWERTY_SPACE, + KEYBOARD_LAYOUT_RMENU = KEYBOARD_LAYOUT_QWERTY_RMENU, + KEYBOARD_LAYOUT_RSUPER = KEYBOARD_LAYOUT_QWERTY_RSUPER, + KEYBOARD_LAYOUT_APPS = KEYBOARD_LAYOUT_QWERTY_APPS, + KEYBOARD_LAYOUT_RCONTROL = KEYBOARD_LAYOUT_QWERTY_RCONTROL, + KEYBOARD_LAYOUT_INSERT = KEYBOARD_LAYOUT_QWERTY_INSERT, + KEYBOARD_LAYOUT_HOME = KEYBOARD_LAYOUT_QWERTY_HOME, + KEYBOARD_LAYOUT_PRIOR = KEYBOARD_LAYOUT_QWERTY_PRIOR, + KEYBOARD_LAYOUT_DELETE = KEYBOARD_LAYOUT_QWERTY_DELETE, + KEYBOARD_LAYOUT_END = KEYBOARD_LAYOUT_QWERTY_END, + KEYBOARD_LAYOUT_NEXT = KEYBOARD_LAYOUT_QWERTY_NEXT, + KEYBOARD_LAYOUT_UP = KEYBOARD_LAYOUT_QWERTY_UP, + KEYBOARD_LAYOUT_LEFT = KEYBOARD_LAYOUT_QWERTY_LEFT, + KEYBOARD_LAYOUT_RIGHT = KEYBOARD_LAYOUT_QWERTY_RIGHT, + KEYBOARD_LAYOUT_DOWN = KEYBOARD_LAYOUT_QWERTY_DOWN, + KEYBOARD_LAYOUT_NUMLOCK = KEYBOARD_LAYOUT_QWERTY_NUMLOCK, + KEYBOARD_LAYOUT_DIVIDE = KEYBOARD_LAYOUT_QWERTY_DIVIDE, + KEYBOARD_LAYOUT_MULTIPLY = KEYBOARD_LAYOUT_QWERTY_MULTIPLY, + KEYBOARD_LAYOUT_SUBTRACT = KEYBOARD_LAYOUT_QWERTY_SUBTRACT, + KEYBOARD_LAYOUT_NUMPAD_1 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_1, + KEYBOARD_LAYOUT_NUMPAD_2 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_2, + KEYBOARD_LAYOUT_NUMPAD_3 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_3, + KEYBOARD_LAYOUT_NUMPAD_4 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_4, + KEYBOARD_LAYOUT_NUMPAD_5 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_5, + KEYBOARD_LAYOUT_NUMPAD_6 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_6, + KEYBOARD_LAYOUT_NUMPAD_7 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_7, + KEYBOARD_LAYOUT_NUMPAD_8 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_8, + KEYBOARD_LAYOUT_NUMPAD_9 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_9, + KEYBOARD_LAYOUT_NUMPAD_0 = KEYBOARD_LAYOUT_QWERTY_NUMPAD_0, + KEYBOARD_LAYOUT_NUMPAD_PERIOD = KEYBOARD_LAYOUT_QWERTY_NUMPAD_PERIOD, + KEYBOARD_LAYOUT_ADD = KEYBOARD_LAYOUT_QWERTY_ADD, + KEYBOARD_LAYOUT_NUMPAD_RETURN = KEYBOARD_LAYOUT_QWERTY_NUMPAD_RETURN, +}; + +#endif \ No newline at end of file diff --git a/src/kernel/main.c b/src/kernel/main.c index 7616fce..9b0dd31 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -17,9 +17,14 @@ #endif +#ifdef __AARCH64 + +#endif + // stdlibs #include +#include #include #include @@ -56,6 +61,7 @@ extern uint8_t __bss_start; // Start of Kernel in memory extern uint8_t __end; // End of Kernel in memory extern int uptime; // System uptime measured by precision timer unit. +extern unsigned RAND_SEED; // Random number generator's seed uint16_t DEBUG_COM_PORT = COM1_PORT; // COM Port to Output Debug strings to @@ -73,8 +79,13 @@ void start(unsigned long magic, unsigned long address) { #ifdef __XTENSA printf("[Xtensa]\n"); #endif + #ifdef __AARCH64 + printf("[Arm64]\n"); + #endif printf("The Nano OS %s\n--------------------------------------------\n", VERSION); + printf("Tip: The RD in the Version stands for Research and Development!\n"); + printf("--------------------------------------------\n"); // Multiboot Debug Stuff // if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) { @@ -97,6 +108,7 @@ void start(unsigned long magic, unsigned long address) { IRQ_RegisterHandler(4, COM1_Serial_Handler); IRQ_RegisterHandler(6, Floppy_Handler); IRQ_RegisterHandler(8, CMOS_RTC_Handler); + RAND_SEED = Read_CMOS(CMOS_RTC_Hours); #endif // Other Stuff Serial_Init(DEBUG_COM_PORT, 9600); @@ -108,6 +120,7 @@ void start(unsigned long magic, unsigned long address) { // Hardware Detection Serial_Printf(DEBUG_COM_PORT, "MEMORY:> There is %dKB of Memory Available\nThe Kernel is loaded between 0x%x and 0x%x\n", Detect_Memory(), __bss_start, __end); printf("%dKB Of Memory Availible!\n", Detect_Memory()); + // printf("Random Number! %u\n", rand()); // Serial_Printf(DEBUG_COM_PORT, "CPU Vendor: %s\n", CPUID_Get_Vendor()); // CPUID Stuff is pain and suffering, like page faults and suffering @@ -126,6 +139,9 @@ void start(unsigned long magic, unsigned long address) { BCD2BIN(Read_CMOS(CMOS_RTC_Year))); // Beep! PCSP_Beep(); + char* answer; + printf("Would you like to change the time and date? [Y/n] "); + scanf(""); end: for (;;); diff --git a/src/kernel/nanstd.c b/src/kernel/nanstd.c index f9319da..0e858c9 100644 --- a/src/kernel/nanstd.c +++ b/src/kernel/nanstd.c @@ -9,13 +9,19 @@ extern uint8_t _keyboard_scancode; -char kscan() { - switch(_keyboard_scancode) { - case 1: - default: return 0; - } +// Prints a helpful tip! +void printTip() { + } -void kscanHelper(char character) { +/*Calculate Factorial of `N`*/ +unsigned int factorial(unsigned int N) { + int fact = 1, i; -} \ No newline at end of file + // Loop from 1 to N to get the factorial + for (i = 1; i <= N; i++) { + fact *= i; + } + + return fact; +} diff --git a/src/kernel/nanstd.h b/src/kernel/nanstd.h index e05de0c..49a04aa 100644 --- a/src/kernel/nanstd.h +++ b/src/kernel/nanstd.h @@ -5,3 +5,4 @@ \*----------------*/ #pragma once +unsigned int factorial(unsigned int N); \ No newline at end of file diff --git a/src/kernel/stdbool.h b/src/kernel/stdbool.h new file mode 100644 index 0000000..25f8cb2 --- /dev/null +++ b/src/kernel/stdbool.h @@ -0,0 +1,11 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2026| +|Xircon | +\*----------------*/ +#pragma once + +#define TRUE 1 +#define FALSE 0 + +typedef enum { false, true } bool; \ No newline at end of file diff --git a/src/kernel/stdint.h b/src/kernel/stdint.h new file mode 100644 index 0000000..39e49d8 --- /dev/null +++ b/src/kernel/stdint.h @@ -0,0 +1,39 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2026| +|Xircon | +\*----------------*/ +#pragma once + +#define UINT8_MAX 255 +#define UINT16_MAX 65535 +#define UINT32_MAX 4294967295 +#define UINT64_MAX 18446744073709551615 + +#define UINT8_MIN 0 +#define UINT16_MIN 0 +#define UINT32_MIN 0 +#define UINT64_MIN 0 + +#define INT8_MAX 127 +#define INT16_MAX 32767 +#define INT32_MAX 2147483647 +#define INT64_MAX 9223372036854775807 + +#define INT8_MIN -128 +#define INT16_MIN -32768 +#define INT32_MIN -2147483648 +#define INT64_MIN -9223372036854775808 + +// Unsigned ints +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned long int uint32_t; +typedef unsigned long long uint64_t; + +// Signed ints +typedef signed char int8_t; +typedef signed short int int16_t; +typedef signed long int int32_t; +typedef signed long long int64_t; + diff --git a/src/kernel/stdio.c b/src/kernel/stdio.c index 00d3944..2c90e8d 100644 --- a/src/kernel/stdio.c +++ b/src/kernel/stdio.c @@ -12,6 +12,8 @@ #include #include +#include + const uint8_t DEFAULT_COLOUR = 0x6; @@ -341,3 +343,69 @@ void print_buffer(const char* msg, const void* buffer, uint32_t count) puts("\n"); } +#define SCANF_STATE_NORMAL 0 +#define SCANF_STATE_SPEC 1 + +#define SCANF_MODE_DEFAULT 2 +#define SCANF_MODE_STRING 3 +#define SCANF_MODE_CHAR 4 +#define SCANF_MODE_NUMBER 5 + +/*Take user input from Keyboard!*/ +int scanf(const char* fmt, ...) { + va_list(args); + va_start(args, fmt); + int state = SCANF_STATE_NORMAL; + int mode = SCANF_MODE_DEFAULT; + + while (*fmt) + { + switch (state) + { + case SCANF_STATE_NORMAL: + switch (*fmt) + { + case '%': goto SCANF_STATE_SPEC_; + break; + default: break; + } + + case SCANF_STATE_SPEC: + SCANF_STATE_SPEC_: + switch (*fmt) + { + case 'c': mode = SCANF_MODE_CHAR; + break; + + case 's': mode = SCANF_MODE_STRING; + break; + + case 'd': mode = SCANF_MODE_NUMBER; + break; + + // ignore invalid spec + default: break; + } + // reset state + state = SCANF_STATE_NORMAL; + } + + fmt++; + } + + switch(mode) { + case SCANF_MODE_DEFAULT: + for(;;) { + char character = '\0'; + character = kscan(); + switch (character) { + case '\n': return 0; + default: if(character != 0) {printf("%c", character); character = 0;} + } + } + + default: return 0; + + } + return 0; +} \ No newline at end of file diff --git a/src/kernel/stdio.h b/src/kernel/stdio.h index 0793e1e..edad01a 100644 --- a/src/kernel/stdio.h +++ b/src/kernel/stdio.h @@ -13,4 +13,5 @@ void puts(const char* str); void printf(const char* fmt, ...); void print_buffer(const char* msg, const void* buffer, uint32_t count); void movecursorpos(int x, int y); -void getcursorpos(int x, int y); \ No newline at end of file +void getcursorpos(int x, int y); +int scanf(const char *fmt, ...); \ No newline at end of file diff --git a/src/kernel/stdlib.c b/src/kernel/stdlib.c new file mode 100644 index 0000000..e7cf4ff --- /dev/null +++ b/src/kernel/stdlib.c @@ -0,0 +1,26 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2026| +|Xircon | +\*----------------*/ +#include "stdlib.h" + +#include + +#include + +extern int uptime; +unsigned RAND_SEED = 23; +unsigned bit; + +/*Random Number Generator using a Linear Feedback Shift Register*/ +unsigned rand(void) { + RAND_SEED = (RAND_SEED + uptime - Read_CMOS(CMOS_RTC_Minutes) + Read_CMOS(CMOS_RTC_Seconds)); + bit = ((factorial(RAND_SEED+uptime) >> 0) ^ (RAND_SEED >> 2) ^ ((RAND_SEED+Read_CMOS(CMOS_RTC_Seconds)) >> 3) ^ ((RAND_SEED+uptime) >> 5)) & 1; + return RAND_SEED = (RAND_SEED >> 1) | (bit << 15); +} + +/*Set the seed for Random Number Generator*/ +void srand(unsigned seed) { + RAND_SEED = seed; +} \ No newline at end of file diff --git a/src/kernel/stdlib.h b/src/kernel/stdlib.h new file mode 100644 index 0000000..75beade --- /dev/null +++ b/src/kernel/stdlib.h @@ -0,0 +1,12 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2026| +|Xircon | +\*----------------*/ +#pragma once + +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + +unsigned rand(void); +void srand(unsigned); \ No newline at end of file diff --git a/src/kernel/version.h b/src/kernel/version.h index c0236c3..be24d57 100644 --- a/src/kernel/version.h +++ b/src/kernel/version.h @@ -6,6 +6,6 @@ #pragma once #define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/" // Nanite's Logo as a formatted string -#define VERSION "RD-00056" // Current Version of Nanite +#define VERSION "RD-00124" // Current Version of Nanite #define BOOTLOGO " _ ______ ____ ____ ______\n / | / / __ )/ __ \\/ __ /_ __/\n / |/ / __ / / / / / / // / \n / /| / /_/ / /_/ / /_/ // / \n/_/ |_/_____/\\____/\\____//_/ \n" // Old bootloader logo // one day i will re-implement NBOOT V 2