We work to earn the right to work over here...

This commit is contained in:
Xircon 2026-05-06 02:18:08 -04:00
parent 994dc65831
commit b3087a2b64
23 changed files with 631 additions and 24 deletions

4
.ccls
View File

@ -3,4 +3,6 @@ clang
%c -isystem./src/kernel/ %c -isystem./src/kernel/
%c -fno-builtin %c -fno-builtin
%c -D__I686 %c -D__I686
%c -D__XTENSA %c -D__XTENSA
%c -D__AARCH64
%c -D__LAYOUT_QWERTY

View File

@ -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. #### Note: Kernel is currently under very heavy development. All things are subject to change at any time.
## Building ## 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`) 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. You could also run `make all` but the scripts a bit better tbh, it even automates starting QEMU and building an image.

101
build.aarch64 Executable file
View File

@ -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

View File

@ -38,15 +38,15 @@ case $yn in
echo Installing GRUB! echo Installing GRUB!
echo ---------------- echo ----------------
sudo losetup -d /dev/loop969 sudo losetup -d /dev/loop900
dd if=/dev/zero of=build/main.img bs=512 count=50000 dd if=/dev/zero of=build/main.img bs=512 count=50000
mkdir -p build/mnt mkdir -p build/mnt
sudo losetup -P /dev/loop969 build/main.img sudo losetup -P /dev/loop900 build/main.img
sudo parted /dev/loop969 mktable msdos sudo parted /dev/loop900 mktable msdos
sudo parted /dev/loop969 mkpart primary fat16 2048s 100% sudo parted /dev/loop900 mkpart primary fat16 2048s 100%
sudo parted /dev/loop969p1 set 1 boot on sudo parted /dev/loop900p1 set 1 boot on
sudo mkfs.fat -F16 /dev/loop969p1 sudo mkfs.fat -F16 /dev/loop900p1
sudo mount /dev/loop969p1 build/mnt sudo mount /dev/loop900p1 build/mnt
sudo mkdir build/mnt/boot sudo mkdir build/mnt/boot
sudo mkdir build/mnt/boot/grub sudo mkdir build/mnt/boot/grub
sudo mkdir build/mnt/misc sudo mkdir build/mnt/misc
@ -59,9 +59,9 @@ case $yn in
--boot-directory=build/mnt/boot \ --boot-directory=build/mnt/boot \
--target=i386-pc \ --target=i386-pc \
--bootloader-id=GRUB \ --bootloader-id=GRUB \
/dev/loop969 -v /dev/loop900 -v
sudo umount build/mnt sudo umount build/mnt
sudo losetup -d /dev/loop969 sudo losetup -d /dev/loop900
;; ;;
n ) echo exiting...; n ) echo exiting...;

View File

@ -1,6 +1,7 @@
TARGET_DEFINE = __I686 TARGET_DEFINE = __I686
KEYBOARD_LAYOUT = QWERTY
TARGET_ASMFLAGS += -f elf 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_LIBS += -lgcc
TARGET_LINKFLAGS += -T linker.ld -nostdlib 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) HEADERS_ASM_xtensa-esp32-elf = $(wildcard arch/xtensa/*.inc)
SOURCES_ASM_xtensa-esp32-elf = $(wildcard arch/xtensa/*.asm) 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 # 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))) OBJECTS_ASM = $(patsubst %.asm, $(BUILD_DIR)/kernel/asm/%.obj, $(SOURCES_ASM_$(TARGET)))

View File

@ -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

View File

@ -3,6 +3,7 @@
;COPYRIGHT (C) 2026 ; ;COPYRIGHT (C) 2026 ;
;Xircon ; ;Xircon ;
;/////////////////////; ;/////////////////////;
[bits 32]
global CPUID_Check_Supported global CPUID_Check_Supported
CPUID_Check_Supported: CPUID_Check_Supported:

View File

@ -3,6 +3,7 @@
;COPYRIGHT (C) 2026 ; ;COPYRIGHT (C) 2026 ;
;Xircon ; ;Xircon ;
;/////////////////////; ;/////////////////////;
[bits 32]
global outb global outb
outb: outb:

View File

View File

@ -7,7 +7,7 @@
#ifdef __I686 #ifdef __I686
#include <arch/i686/io.h> #include <arch/i686/io.h>
#endif
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@ -156,3 +156,4 @@ bool DMA_Init_Floppy(uint8_t* buffer, unsigned length)
return true; return true;
} }
#endif

View File

@ -5,6 +5,7 @@
\*----------------*/ \*----------------*/
#pragma once #pragma once
#ifdef __I686
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
@ -118,4 +119,5 @@ enum DMA_MODE_REG_MASK {
DMA_MODE_TRANSFER_SINGLE = 0x40, DMA_MODE_TRANSFER_SINGLE = 0x40,
DMA_MODE_TRANSFER_BLOCK = 0x80, DMA_MODE_TRANSFER_BLOCK = 0x80,
DMA_MODE_TRANSFER_CASCADE = 0xC0 DMA_MODE_TRANSFER_CASCADE = 0xC0
}; };
#endif

View File

@ -21,7 +21,7 @@ bool _keyboard_disable; // True if keyboard is disabled, false if not
bool _numlock, _capslock, _scrolllock; // Is true when toggeld bool _numlock, _capslock, _scrolllock; // Is true when toggeld
bool _ctrl, _alt, _shift; // True if pressed 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; extern uint16_t DEBUG_COM_PORT;
@ -138,3 +138,75 @@ void Keyboard_Init()
_shift = _alt = _ctrl = false; _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';
}
}

View File

@ -19,6 +19,7 @@ void Keyboard_Controller_Send_Command(uint8_t command);
uint8_t Keyboard_Controller_Status(); uint8_t Keyboard_Controller_Status();
uint8_t Keyboard_Read_Encoder_Buffer(); uint8_t Keyboard_Read_Encoder_Buffer();
bool Keyboard_Self_Test(); bool Keyboard_Self_Test();
char kscan();
@ -58,3 +59,221 @@ enum KEYBOARD_ENC_CMD {
KEYBOARD_ENC_CMD_SET_LED = 0xED 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

View File

@ -17,9 +17,14 @@
#endif #endif
#ifdef __AARCH64
#endif
// stdlibs // stdlibs
#include <stdint.h> #include <stdint.h>
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <memory.h> #include <memory.h>
@ -56,6 +61,7 @@ extern uint8_t __bss_start; // Start of Kernel in memory
extern uint8_t __end; // End of Kernel in memory extern uint8_t __end; // End of Kernel in memory
extern int uptime; // System uptime measured by precision timer unit. 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 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 #ifdef __XTENSA
printf("[Xtensa]\n"); printf("[Xtensa]\n");
#endif #endif
#ifdef __AARCH64
printf("[Arm64]\n");
#endif
printf("The Nano OS %s\n--------------------------------------------\n", VERSION); 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 // Multiboot Debug Stuff
// if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) { // 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(4, COM1_Serial_Handler);
IRQ_RegisterHandler(6, Floppy_Handler); IRQ_RegisterHandler(6, Floppy_Handler);
IRQ_RegisterHandler(8, CMOS_RTC_Handler); IRQ_RegisterHandler(8, CMOS_RTC_Handler);
RAND_SEED = Read_CMOS(CMOS_RTC_Hours);
#endif #endif
// Other Stuff // Other Stuff
Serial_Init(DEBUG_COM_PORT, 9600); Serial_Init(DEBUG_COM_PORT, 9600);
@ -108,6 +120,7 @@ void start(unsigned long magic, unsigned long address) {
// Hardware Detection // 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); 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("%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 // 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))); BCD2BIN(Read_CMOS(CMOS_RTC_Year)));
// Beep! // Beep!
PCSP_Beep(); PCSP_Beep();
char* answer;
printf("Would you like to change the time and date? [Y/n] ");
scanf("");
end: end:
for (;;); for (;;);

View File

@ -9,13 +9,19 @@
extern uint8_t _keyboard_scancode; extern uint8_t _keyboard_scancode;
char kscan() { // Prints a helpful tip!
switch(_keyboard_scancode) { void printTip() {
case 1:
default: return 0;
}
} }
void kscanHelper(char character) { /*Calculate Factorial of `N`*/
unsigned int factorial(unsigned int N) {
int fact = 1, i;
} // Loop from 1 to N to get the factorial
for (i = 1; i <= N; i++) {
fact *= i;
}
return fact;
}

View File

@ -5,3 +5,4 @@
\*----------------*/ \*----------------*/
#pragma once #pragma once
unsigned int factorial(unsigned int N);

11
src/kernel/stdbool.h Normal file
View File

@ -0,0 +1,11 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2026|
|Xircon |
\*----------------*/
#pragma once
#define TRUE 1
#define FALSE 0
typedef enum { false, true } bool;

39
src/kernel/stdint.h Normal file
View File

@ -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;

View File

@ -12,6 +12,8 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdbool.h> #include <stdbool.h>
#include <dri/keyboard.h>
const uint8_t DEFAULT_COLOUR = 0x6; const uint8_t DEFAULT_COLOUR = 0x6;
@ -341,3 +343,69 @@ void print_buffer(const char* msg, const void* buffer, uint32_t count)
puts("\n"); 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;
}

View File

@ -13,4 +13,5 @@ void puts(const char* str);
void printf(const char* fmt, ...); void printf(const char* fmt, ...);
void print_buffer(const char* msg, const void* buffer, uint32_t count); void print_buffer(const char* msg, const void* buffer, uint32_t count);
void movecursorpos(int x, int y); void movecursorpos(int x, int y);
void getcursorpos(int x, int y); void getcursorpos(int x, int y);
int scanf(const char *fmt, ...);

26
src/kernel/stdlib.c Normal file
View File

@ -0,0 +1,26 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2026|
|Xircon |
\*----------------*/
#include "stdlib.h"
#include <nanstd.h>
#include <dri/cmos.h>
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;
}

12
src/kernel/stdlib.h Normal file
View File

@ -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);

View File

@ -6,6 +6,6 @@
#pragma once #pragma once
#define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/" // Nanite's Logo as a formatted string #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 #define BOOTLOGO " _ ______ ____ ____ ______\n / | / / __ )/ __ \\/ __ /_ __/\n / |/ / __ / / / / / / // / \n / /| / /_/ / /_/ / /_/ // / \n/_/ |_/_____/\\____/\\____//_/ \n" // Old bootloader logo
// one day i will re-implement NBOOT V 2 // one day i will re-implement NBOOT V 2