From 89536d1f20dae094b9e18c2f2e8b930f94fbc2c4 Mon Sep 17 00:00:00 2001 From: Alee Date: Sun, 13 May 2018 16:58:36 -0400 Subject: Added souce files --- aleeos.iso | Bin 0 -> 20326400 bytes aleeos/boot/grub/grub.cfg | 7 ++ aleeos/boot/kernel.bin | Bin 0 -> 11276 bytes build.sh | 11 ++ include/kb.h | 311 ++++++++++++++++++++++++++++++++++++++++++++++ include/screen.h | 116 +++++++++++++++++ include/string.h | 31 +++++ include/system.h | 16 +++ include/types.h | 18 +++ kasm.o | Bin 0 -> 512 bytes kc.o | Bin 0 -> 9304 bytes kernel.asm | 13 ++ kernel.c | 46 +++++++ link.ld | 9 ++ 14 files changed, 578 insertions(+) create mode 100644 aleeos.iso create mode 100644 aleeos/boot/grub/grub.cfg create mode 100755 aleeos/boot/kernel.bin create mode 100755 build.sh create mode 100644 include/kb.h create mode 100644 include/screen.h create mode 100644 include/string.h create mode 100644 include/system.h create mode 100644 include/types.h create mode 100644 kasm.o create mode 100644 kc.o create mode 100644 kernel.asm create mode 100644 kernel.c create mode 100644 link.ld diff --git a/aleeos.iso b/aleeos.iso new file mode 100644 index 0000000..4f22dba Binary files /dev/null and b/aleeos.iso differ diff --git a/aleeos/boot/grub/grub.cfg b/aleeos/boot/grub/grub.cfg new file mode 100644 index 0000000..7709cc8 --- /dev/null +++ b/aleeos/boot/grub/grub.cfg @@ -0,0 +1,7 @@ +set default=0 +set timeout=3 + +menuentry "AleeOS" { + set root='(hd96)' + multiboot /boot/kernel.bin +} \ No newline at end of file diff --git a/aleeos/boot/kernel.bin b/aleeos/boot/kernel.bin new file mode 100755 index 0000000..f72c4c4 Binary files /dev/null and b/aleeos/boot/kernel.bin differ diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..e2d47c0 --- /dev/null +++ b/build.sh @@ -0,0 +1,11 @@ +echo 'Compiling...' +nasm -f elf32 kernel.asm -o kasm.o +gcc -m32 -c kernel.c -o kc.o -ffreestanding +echo 'Linking the 2 kernels...' +ld -m elf_i386 -T link.ld -o aleeos/boot/kernel.bin kasm.o kc.o +echo 'Generating ISO and grub...' +grub-mkrescue -o aleeos.iso aleeos/ +echo 'Launching QEMU...' +qemu-system-x86_64 -kernel aleeos/boot/kernel.bin + +read a \ No newline at end of file diff --git a/include/kb.h b/include/kb.h new file mode 100644 index 0000000..94ab19e --- /dev/null +++ b/include/kb.h @@ -0,0 +1,311 @@ +#ifndef KB_H +#define KB_H +#include "screen.h" +#include "system.h" +#include "types.h" + +string readStr() +{ + char buff; + string buffstr; + uint8 i = 0; + uint8 reading = 1; + while(reading) + { + if(inportb(0x64) & 0x1) + { + switch(inportb(0x60)) + { + /*case 1: + printch('(char)27); Escape button + buffstr[i] = (char)27; + i++; + break;*/ + case 2: + printch('1'); + buffstr[i] = '1'; + i++; + break; + case 3: + printch('2'); + buffstr[i] = '2'; + i++; + break; + case 4: + printch('3'); + buffstr[i] = '3'; + i++; + break; + case 5: + printch('4'); + buffstr[i] = '4'; + i++; + break; + case 6: + printch('5'); + buffstr[i] = '5'; + i++; + break; + case 7: + printch('6'); + buffstr[i] = '6'; + i++; + break; + case 8: + printch('7'); + buffstr[i] = '7'; + i++; + break; + case 9: + printch('8'); + buffstr[i] = '8'; + i++; + break; + case 10: + printch('9'); + buffstr[i] = '9'; + i++; + break; + case 11: + printch('0'); + buffstr[i] = '0'; + i++; + break; + case 12: + printch('-'); + buffstr[i] = '-'; + i++; + break; + case 13: + printch('='); + buffstr[i] = '='; + i++; + break; + case 14: + printch('\b'); + i--; + buffstr[i] = 0; + break; + /* case 15: + printch('\t'); Tab button + buffstr[i] = '\t'; + i++; + break;*/ + case 16: + printch('q'); + buffstr[i] = 'q'; + i++; + break; + case 17: + printch('w'); + buffstr[i] = 'w'; + i++; + break; + case 18: + printch('e'); + buffstr[i] = 'e'; + i++; + break; + case 19: + printch('r'); + buffstr[i] = 'r'; + i++; + break; + case 20: + printch('t'); + buffstr[i] = 't'; + i++; + break; + case 21: + printch('y'); + buffstr[i] = 'y'; + i++; + break; + case 22: + printch('u'); + buffstr[i] = 'u'; + i++; + break; + case 23: + printch('i'); + buffstr[i] = 'i'; + i++; + break; + case 24: + printch('o'); + buffstr[i] = 'o'; + i++; + break; + case 25: + printch('p'); + buffstr[i] = 'p'; + i++; + break; + case 26: + printch('['); + buffstr[i] = '['; + i++; + break; + case 27: + printch(']'); + buffstr[i] = ']'; + i++; + break; + case 28: + // printch('\n'); + // buffstr[i] = '\n'; + i++; + reading = 0; + break; + /* case 29: + printch('q'); Left Control + buffstr[i] = 'q'; + i++; + break;*/ + case 30: + printch('a'); + buffstr[i] = 'a'; + i++; + break; + case 31: + printch('s'); + buffstr[i] = 's'; + i++; + break; + case 32: + printch('d'); + buffstr[i] = 'd'; + i++; + break; + case 33: + printch('f'); + buffstr[i] = 'f'; + i++; + break; + case 34: + printch('g'); + buffstr[i] = 'g'; + i++; + break; + case 35: + printch('h'); + buffstr[i] = 'h'; + i++; + break; + case 36: + printch('j'); + buffstr[i] = 'j'; + i++; + break; + case 37: + printch('k'); + buffstr[i] = 'k'; + i++; + break; + case 38: + printch('l'); + buffstr[i] = 'l'; + i++; + break; + case 39: + printch(';'); + buffstr[i] = ';'; + i++; + break; + case 40: + printch((char)44); // Single quote (') + buffstr[i] = (char)44; + i++; + break; + case 41: + printch((char)44); // Back tick (`) + buffstr[i] = (char)44; + i++; + break; + /* case 42: Left shift + printch('q'); + buffstr[i] = 'q'; + i++; + break; + case 43: \ (< for somekeyboards) + printch((char)92); + buffstr[i] = 'q'; + i++; + break;*/ + case 44: + printch('z'); + buffstr[i] = 'z'; + i++; + break; + case 45: + printch('x'); + buffstr[i] = 'x'; + i++; + break; + case 46: + printch('c'); + buffstr[i] = 'c'; + i++; + break; + case 47: + printch('v'); + buffstr[i] = 'v'; + i++; + break; + case 48: + printch('b'); + buffstr[i] = 'b'; + i++; + break; + case 49: + printch('n'); + buffstr[i] = 'n'; + i++; + break; + case 50: + printch('m'); + buffstr[i] = 'm'; + i++; + break; + case 51: + printch(','); + buffstr[i] = ','; + i++; + break; + case 52: + printch('.'); + buffstr[i] = '.'; + i++; + break; + case 53: + printch('/'); + buffstr[i] = '/'; + i++; + break; + case 54: + printch('.'); + buffstr[i] = '.'; + i++; + break; + case 55: + printch('/'); + buffstr[i] = '/'; + i++; + break; + /*case 56: + printch(' '); Right shift + buffstr[i] = ' '; + i++; + break;*/ + case 57: + printch(' '); + buffstr[i] = ' '; + i++; + break; + } + } + } + buffstr[i] = 0; + return buffstr; +} +#endif diff --git a/include/screen.h b/include/screen.h new file mode 100644 index 0000000..9d2873e --- /dev/null +++ b/include/screen.h @@ -0,0 +1,116 @@ +#ifndef SCREEN_H +#define SCREEN_H +#include "types.h" +#include "system.h" +#include "string.h" +int cursorX = 0, cursorY = 0; +const uint8 sw = 80,sh = 25,sd = 2; //We define the screen width, height, and depth. +void clearLine(uint8 from,uint8 to) +{ + uint16 i = sw * from * sd; + string vidmem=(string)0xb8000; + for(i;i<(sw*to*sd);i++) + { + vidmem[i] = 0x0; + } +} +void updateCursor() +{ + unsigned temp; + + temp = cursorY * sw + cursorX; // Position = (y * width) + x + + outportb(0x3D4, 14); // CRT Control Register: Select Cursor Location + outportb(0x3D5, temp >> 8); // Send the high byte across the bus + outportb(0x3D4, 15); // CRT Control Register: Select Send Low byte + outportb(0x3D5, temp); // Send the Low byte of the cursor location +} +void clearScreen() +{ + clearLine(0,sh-1); + cursorX = 0; + cursorY = 0; + updateCursor(); +} + +void scrollUp(uint8 lineNumber) +{ + string vidmem = (string)0xb8000; + uint16 i = 0; + clearLine(0,lineNumber-1); //updated + for (i;i=sh-1) + { + scrollUp(1); + } +} + +void printch(char c) +{ + string vidmem = (string) 0xb8000; + switch(c) + { + case (0x08): + if(cursorX > 0) + { + cursorX--; + vidmem[(cursorY * sw + cursorX)*sd]=0x00; + } + break; + /* case (0x09): + cursorX = (cursorX + 8) & ~(8 - 1); + break;*/ + case ('\r'): + cursorX = 0; + break; + case ('\n'): + cursorX = 0; + cursorY++; + break; + default: + vidmem [((cursorY * sw + cursorX))*sd] = c; + vidmem [((cursorY * sw + cursorX))*sd+1] = 0x0F; + cursorX++; + break; + + } + if(cursorX >= sw) + { + cursorX = 0; + cursorY++; + } + updateCursor(); + newLineCheck(); +} + +void print (string ch) +{ + uint16 i = 0; + uint8 length = strlength(ch)-1; //Updated (Now we store string length on a variable to call the function only once) + for(i;i \n"); + + string ch = readStr(); + if(strEql(ch,"help")) + { + print("\nAleeOS Commands\n=================\nhelp\nping\ncmd\ncls/clear\nversion\n"); + } + else if(strEql(ch,"cmd")) + { + print("\nYou are already in cmd\n"); + } + else if(strEql(ch,"clear")) + { + clearScreen(); + } + else if(strEql(ch,"cls")) + { + clearScreen(); + } + else if(strEql(ch,"version")) + { + print("\nAleeOS Version: 1.0 \nKernel Version: 0.1\n"); + } + else if(strEql(ch,"ping")) + { + print("\nPONG! Why does this command exist...\n"); + } + + else + { + print("\nBad command!\n"); + } + + print("\n"); + } +} \ No newline at end of file diff --git a/link.ld b/link.ld new file mode 100644 index 0000000..f3fb7a2 --- /dev/null +++ b/link.ld @@ -0,0 +1,9 @@ +OUTPUT_FORMAT(elf32-i386) +ENTRY(start) +SECTIONS + { + . = 0x100000; + .text : { *(.text) } + .data : { *(.data) } + .bss : { *(.bss) } +} \ No newline at end of file -- cgit v1.2.3