aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aleeos.isobin0 -> 20326400 bytes
-rw-r--r--aleeos/boot/grub/grub.cfg7
-rwxr-xr-xaleeos/boot/kernel.binbin0 -> 11276 bytes
-rwxr-xr-xbuild.sh11
-rw-r--r--include/kb.h311
-rw-r--r--include/screen.h116
-rw-r--r--include/string.h31
-rw-r--r--include/system.h16
-rw-r--r--include/types.h18
-rw-r--r--kasm.obin0 -> 512 bytes
-rw-r--r--kc.obin0 -> 9304 bytes
-rw-r--r--kernel.asm13
-rw-r--r--kernel.c46
-rw-r--r--link.ld9
14 files changed, 578 insertions, 0 deletions
diff --git a/aleeos.iso b/aleeos.iso
new file mode 100644
index 0000000..4f22dba
--- /dev/null
+++ b/aleeos.iso
Binary files 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
--- /dev/null
+++ b/aleeos/boot/kernel.bin
Binary files 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<sw*(sh-1)*2;i++)
+ {
+ vidmem[i] = vidmem[i+sw*2*lineNumber];
+ }
+ clearLine(sh-1-lineNumber,sh-1);
+ if((cursorY - lineNumber) < 0 )
+ {
+ cursorY = 0;
+ cursorX = 0;
+ }
+ else
+ {
+ cursorY -= lineNumber;
+ }
+ updateCursor();
+}
+
+
+void newLineCheck()
+{
+ if(cursorY >=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<length;i++)
+ {
+ printch(ch[i]);
+ }
+}
+
+
+#endif
diff --git a/include/string.h b/include/string.h
new file mode 100644
index 0000000..72b15cf
--- /dev/null
+++ b/include/string.h
@@ -0,0 +1,31 @@
+#ifndef STRING_H
+#define STRING_H
+
+#include "types.h"
+uint16 strlength(string ch)
+{
+ uint16 i = 1;
+ while(ch[i++]);
+ return --i;
+}
+
+/* Added in episode 3*/ /*This function compares two strings and returns true (1) if they are equal or false (0) if they are not equal */
+
+uint8 strEql(string ch1,string ch2)
+{
+ uint8 result = 1;
+ uint8 size = strlength(ch1);
+ if(size != strlength(ch2)) result =0;
+ else
+ {
+ uint8 i = 0;
+ for(i;i<=size;i++)
+ {
+ if(ch1[i] != ch2[i]) result = 0;
+ }
+ }
+ return result;
+}
+
+
+#endif
diff --git a/include/system.h b/include/system.h
new file mode 100644
index 0000000..6184c31
--- /dev/null
+++ b/include/system.h
@@ -0,0 +1,16 @@
+#ifndef SYSTEM_H
+#define SYSTEM_H
+#include "types.h"
+uint8 inportb (uint16 _port)
+{
+ uint8 rv;
+ __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port));
+ return rv;
+}
+
+void outportb (uint16 _port, uint8 _data)
+{
+ __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
+}
+
+#endif
diff --git a/include/types.h b/include/types.h
new file mode 100644
index 0000000..6a8d0a8
--- /dev/null
+++ b/include/types.h
@@ -0,0 +1,18 @@
+#ifndef TYPES_H
+#define TYPES_H
+
+typedef signed char int8;
+typedef unsigned char uint8;
+
+typedef signed short int16;
+typedef unsigned short uint16;
+
+typedef signed int int32;
+typedef unsigned int uint32;
+
+typedef signed long long int64;
+typedef unsigned long long uint64;
+
+typedef char* string;
+
+#endif
diff --git a/kasm.o b/kasm.o
new file mode 100644
index 0000000..bb893b4
--- /dev/null
+++ b/kasm.o
Binary files differ
diff --git a/kc.o b/kc.o
new file mode 100644
index 0000000..99b5c9a
--- /dev/null
+++ b/kc.o
Binary files differ
diff --git a/kernel.asm b/kernel.asm
new file mode 100644
index 0000000..d1ed30a
--- /dev/null
+++ b/kernel.asm
@@ -0,0 +1,13 @@
+bits 32
+section .text
+align 4
+dd 0x1BADB002
+dd 0x00
+dd - (0x1BADB002+0x00)
+
+global start
+extern kmain
+start:
+ cli
+ call kmain
+ hlt \ No newline at end of file
diff --git a/kernel.c b/kernel.c
new file mode 100644
index 0000000..2989ea8
--- /dev/null
+++ b/kernel.c
@@ -0,0 +1,46 @@
+#include "include/screen.h"
+#include "include/kb.h"
+#include "include/string.h"
+kmain ()
+{
+
+ clearScreen();
+ print("Welcome to AleeOS 1.0 Pre Alpha!\nTo get started type \'help\'.\n");
+ while (1)
+ {
+ print("\nAleeOS> \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