aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2022-01-10 22:15:15 +0100
committerAleksa Vučković <aleksav013@gmail.com>2022-01-10 22:43:56 +0100
commit0bff8199e4a800d5ea1bd422dcf06643d6daf008 (patch)
tree15108a0073d66afc026c0a2225474c2d61e71b34
parent97d99fa196d4b732cfd6635dcb8b0a9c9228c88d (diff)
include/setup.sh
-rw-r--r--Makefile5
-rw-r--r--include/01.pocetak/boot.s70
-rw-r--r--include/01.pocetak/boot03.s11
-rw-r--r--include/01.pocetak/deo1 (renamed from include/01.pocetak/boot00.s)0
-rw-r--r--include/01.pocetak/deo105
-rw-r--r--include/01.pocetak/deo1112
-rw-r--r--include/01.pocetak/deo121
-rw-r--r--include/01.pocetak/deo2 (renamed from include/01.pocetak/boot01.s)0
-rw-r--r--include/01.pocetak/deo36
-rw-r--r--include/01.pocetak/deo44
-rw-r--r--include/01.pocetak/deo55
-rw-r--r--include/01.pocetak/deo64
-rw-r--r--include/01.pocetak/deo75
-rw-r--r--include/01.pocetak/deo82
-rw-r--r--include/01.pocetak/deo9 (renamed from include/01.pocetak/boot02.s)0
-rw-r--r--include/02.vga/deo1 (renamed from include/02.vga/vga00.c)0
-rw-r--r--include/02.vga/deo10 (renamed from include/02.vga/vga09.c)4
-rw-r--r--include/02.vga/deo11 (renamed from include/02.vga/vga10.c)0
-rw-r--r--include/02.vga/deo128
-rw-r--r--include/02.vga/deo138
-rw-r--r--include/02.vga/deo14 (renamed from include/02.vga/vga11.c)0
-rw-r--r--include/02.vga/deo2 (renamed from include/02.vga/vga01.c)0
-rw-r--r--include/02.vga/deo3 (renamed from include/02.vga/vga02.c)0
-rw-r--r--include/02.vga/deo4 (renamed from include/02.vga/vga03.c)0
-rw-r--r--include/02.vga/deo5 (renamed from include/02.vga/vga04.c)10
-rw-r--r--include/02.vga/deo6 (renamed from include/02.vga/vga05.c)0
-rw-r--r--include/02.vga/deo7 (renamed from include/02.vga/vga06.c)3
-rw-r--r--include/02.vga/deo8 (renamed from include/02.vga/vga07.c)0
-rw-r--r--include/02.vga/deo9 (renamed from include/02.vga/vga08.c)0
-rw-r--r--include/02.vga/vga.c100
-rw-r--r--include/03.gdt/deo1 (renamed from include/03.gdt/gdt00.c)0
-rw-r--r--include/03.gdt/deo2 (renamed from include/03.gdt/gdt01.c)0
-rw-r--r--include/03.gdt/deo3 (renamed from include/03.gdt/gdt02.c)0
-rw-r--r--include/03.gdt/deo41
-rw-r--r--include/03.gdt/deo5 (renamed from include/03.gdt/gdt03.c)1
-rw-r--r--include/03.gdt/deo6 (renamed from include/03.gdt/gdt04.c)0
-rw-r--r--include/03.gdt/deo74
-rw-r--r--include/03.gdt/deo85
-rw-r--r--include/03.gdt/deo92
-rw-r--r--include/03.gdt/gdt.c46
-rw-r--r--include/03.gdt/gdt05.c13
-rw-r--r--include/04.idt/deo1 (renamed from include/04.idt/idt00.c)0
-rw-r--r--include/04.idt/deo10 (renamed from include/04.idt/idt06.c)0
-rw-r--r--include/04.idt/deo11 (renamed from include/05.irq/idt07.c)1
-rw-r--r--include/04.idt/deo12 (renamed from include/05.irq/idt08.c)7
-rw-r--r--include/04.idt/deo132
-rw-r--r--include/04.idt/deo142
-rw-r--r--include/04.idt/deo21
-rw-r--r--include/04.idt/deo32
-rw-r--r--include/04.idt/deo4 (renamed from include/04.idt/idt01.c)3
-rw-r--r--include/04.idt/deo5 (renamed from include/04.idt/idt02.c)0
-rw-r--r--include/04.idt/deo6 (renamed from include/04.idt/idt03.c)0
-rw-r--r--include/04.idt/deo7 (renamed from include/04.idt/idt04.c)2
-rw-r--r--include/04.idt/deo82
-rw-r--r--include/04.idt/deo9 (renamed from include/04.idt/idt05.c)0
-rw-r--r--include/04.idt/idt.c108
-rw-r--r--include/06.keyboard/deo1 (renamed from include/06.keyboard/keyboard00.c)0
-rw-r--r--include/06.keyboard/deo1018
-rw-r--r--include/06.keyboard/deo11 (renamed from include/06.keyboard/keyboard09.c)0
-rw-r--r--include/06.keyboard/deo1211
-rw-r--r--include/06.keyboard/deo1311
-rw-r--r--include/06.keyboard/deo143
-rw-r--r--include/06.keyboard/deo153
-rw-r--r--include/06.keyboard/deo164
-rw-r--r--include/06.keyboard/deo178
-rw-r--r--include/06.keyboard/deo1823
-rw-r--r--include/06.keyboard/deo1922
-rw-r--r--include/06.keyboard/deo2 (renamed from include/06.keyboard/keyboard01.c)0
-rw-r--r--include/06.keyboard/deo207
-rw-r--r--include/06.keyboard/deo3 (renamed from include/06.keyboard/keyboard02.c)0
-rw-r--r--include/06.keyboard/deo4 (renamed from include/06.keyboard/keyboard03.c)0
-rw-r--r--include/06.keyboard/deo57
-rw-r--r--include/06.keyboard/deo6 (renamed from include/06.keyboard/keyboard05.c)0
-rw-r--r--include/06.keyboard/deo7 (renamed from include/06.keyboard/keyboard06.c)0
-rw-r--r--include/06.keyboard/deo83
-rw-r--r--include/06.keyboard/deo9 (renamed from include/06.keyboard/keyboard07.c)4
-rw-r--r--include/06.keyboard/keyboard.c182
-rw-r--r--include/06.keyboard/keyboard04.c6
-rw-r--r--include/06.keyboard/keyboard08.c18
-rw-r--r--include/06.keyboard/keyboard10.c11
-rw-r--r--include/06.keyboard/keyboard11.c11
-rw-r--r--include/06.keyboard/keyboard12.c48
-rw-r--r--include/07.pit/deo1 (renamed from include/07.pit/pit00.c)0
-rw-r--r--include/07.pit/deo104
-rw-r--r--include/07.pit/deo21
-rw-r--r--include/07.pit/deo3 (renamed from include/07.pit/pit01.c)1
-rw-r--r--include/07.pit/deo49
-rw-r--r--include/07.pit/deo53
-rw-r--r--include/07.pit/deo63
-rw-r--r--include/07.pit/deo74
-rw-r--r--include/07.pit/deo82
-rw-r--r--include/07.pit/deo93
-rw-r--r--include/07.pit/pit02.c13
-rw-r--r--include/07.pit/timer.c (renamed from include/07.pit/pit03.c)25
-rw-r--r--include/08.heap/deo1 (renamed from include/08.heap/heap00.c)0
-rw-r--r--include/08.heap/deo105
-rw-r--r--include/08.heap/deo114
-rw-r--r--include/08.heap/deo125
-rw-r--r--include/08.heap/deo137
-rw-r--r--include/08.heap/deo144
-rw-r--r--include/08.heap/deo153
-rw-r--r--include/08.heap/deo165
-rw-r--r--include/08.heap/deo173
-rw-r--r--include/08.heap/deo184
-rw-r--r--include/08.heap/deo194
-rw-r--r--include/08.heap/deo27
-rw-r--r--include/08.heap/deo202
-rw-r--r--include/08.heap/deo212
-rw-r--r--include/08.heap/deo222
-rw-r--r--include/08.heap/deo239
-rw-r--r--include/08.heap/deo247
-rw-r--r--include/08.heap/deo2520
-rw-r--r--include/08.heap/deo263
-rw-r--r--include/08.heap/deo271
-rw-r--r--include/08.heap/deo284
-rw-r--r--include/08.heap/deo29 (renamed from include/08.heap/heap08.c)5
-rw-r--r--include/08.heap/deo3 (renamed from include/08.heap/heap02.c)2
-rw-r--r--include/08.heap/deo30 (renamed from include/08.heap/heap09.c)5
-rw-r--r--include/08.heap/deo314
-rw-r--r--include/08.heap/deo4 (renamed from include/08.heap/heap03.c)2
-rw-r--r--include/08.heap/deo55
-rw-r--r--include/08.heap/deo63
-rw-r--r--include/08.heap/deo72
-rw-r--r--include/08.heap/deo82
-rw-r--r--include/08.heap/deo94
-rw-r--r--include/08.heap/heap.c166
-rw-r--r--include/08.heap/heap01.c7
-rw-r--r--include/08.heap/heap04.c33
-rw-r--r--include/08.heap/heap05.c5
-rw-r--r--include/08.heap/heap06.c58
-rw-r--r--include/08.heap/heap07.c32
-rw-r--r--include/09.paging/deo1 (renamed from include/09.paging/paging00.c)0
-rw-r--r--include/09.paging/deo2 (renamed from include/09.paging/paging01.c)1
-rw-r--r--include/09.paging/deo31
-rw-r--r--include/09.paging/deo412
-rw-r--r--include/09.paging/deo5 (renamed from include/09.paging/paging03.c)0
-rw-r--r--include/09.paging/deo64
-rw-r--r--include/09.paging/deo77
-rw-r--r--include/09.paging/deo83
-rw-r--r--include/09.paging/deo9 (renamed from include/09.paging/paging05.c)0
-rw-r--r--include/09.paging/paging.c46
-rw-r--r--include/09.paging/paging02.c12
-rw-r--r--include/09.paging/paging04.c15
-rw-r--r--include/10.libc/stdio.h9
-rw-r--r--include/10.libc/stdlib.h8
-rw-r--r--include/10.libc/string.h8
-rw-r--r--include/10.libc/sys/types.h2
-rw-r--r--include/10.libc/unistd.h9
-rwxr-xr-xinclude/setup.sh47
-rw-r--r--kernel.pdfbin436239 -> 443380 bytes
-rw-r--r--kernel.tex194
151 files changed, 1320 insertions, 427 deletions
diff --git a/Makefile b/Makefile
index e623549..881f5be 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ TEX_FILE=$(NAME).tex
BIB_FILE=$(NAME).bib
PDF_FILE=$(NAME).pdf
-.PHONY: all
+.PHONY: all clean
all: $(PDF_FILE)
@@ -11,3 +11,6 @@ $(PDF_FILE): $(TEX_FILE) $(BIB_FILE)
pdflatex $(TEX_FILE)
bibtex $(NAME)
pdflatex $(TEX_FILE)
+
+clean:
+ rm $(PDF_FILE)
diff --git a/include/01.pocetak/boot.s b/include/01.pocetak/boot.s
new file mode 100644
index 0000000..907cd3c
--- /dev/null
+++ b/include/01.pocetak/boot.s
@@ -0,0 +1,70 @@
+.set ALIGN, 1<<0
+.set MEMINFO, 1<<1
+.set FLAGS, ALIGN | MEMINFO
+.set MAGIC, 0x1BADB002
+.set CHECKSUM, -(MAGIC + FLAGS)
+
+.section .multiboot
+.align 4
+.long MAGIC
+.long FLAGS
+.long CHECKSUM
+
+.global _start
+.global load_gdt
+.global load_idt
+.global enable_interrupts
+.global ioport_in
+.global ioport_out
+
+load_gdt:
+ movl 4(%esp), %edx
+ lgdt (%edx)
+ ret
+
+load_idt:
+ movl 4(%esp), %edx
+ lidt (%edx)
+ sti
+ ret
+
+ioport_in:
+ movl 4(%esp),%edx
+ in %dx,%al
+ ret
+
+ioport_out:
+ movl 4(%esp),%edx
+ movl 8(%esp),%eax
+ outb %al,%dx
+ ret
+
+.set CODE_SEGMENT, 0x08
+.set DATA_SEGMENT, 0x10
+
+.section .bss
+.align 16
+stack_bottom:
+.skip 16384
+stack_top:
+
+.section .text
+.type _start, @function
+_start:
+ call init_gdt_table
+ ljmp $CODE_SEGMENT, $code
+
+code:
+ movw $DATA_SEGMENT, %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+ movw %ax, %ss
+ movl $stack_top, %esp
+ cli
+ call _init
+ call kernel_main
+ hlt
+
+.size _start, . - _start
diff --git a/include/01.pocetak/boot03.s b/include/01.pocetak/boot03.s
deleted file mode 100644
index 46a4e7f..0000000
--- a/include/01.pocetak/boot03.s
+++ /dev/null
@@ -1,11 +0,0 @@
-.section .text
-.global _start
-.type _start, @function
-_start:
- mov $stack_top, %esp
- call kernel_main
- cli
-1: hlt
- jmp 1b
-
-.size _start, . - _start
diff --git a/include/01.pocetak/boot00.s b/include/01.pocetak/deo1
index 0e1bfbe..0e1bfbe 100644
--- a/include/01.pocetak/boot00.s
+++ b/include/01.pocetak/deo1
diff --git a/include/01.pocetak/deo10 b/include/01.pocetak/deo10
new file mode 100644
index 0000000..3cd7ea1
--- /dev/null
+++ b/include/01.pocetak/deo10
@@ -0,0 +1,5 @@
+.section .text
+.type _start, @function
+_start:
+ call init_gdt_table
+ ljmp $CODE_SEGMENT, $code
diff --git a/include/01.pocetak/deo11 b/include/01.pocetak/deo11
new file mode 100644
index 0000000..bd0f1da
--- /dev/null
+++ b/include/01.pocetak/deo11
@@ -0,0 +1,12 @@
+code:
+ movw $DATA_SEGMENT, %ax
+ movw %ax, %ds
+ movw %ax, %es
+ movw %ax, %fs
+ movw %ax, %gs
+ movw %ax, %ss
+ movl $stack_top, %esp
+ cli
+ call _init
+ call kernel_main
+ hlt
diff --git a/include/01.pocetak/deo12 b/include/01.pocetak/deo12
new file mode 100644
index 0000000..d1d8388
--- /dev/null
+++ b/include/01.pocetak/deo12
@@ -0,0 +1 @@
+.size _start, . - _start
diff --git a/include/01.pocetak/boot01.s b/include/01.pocetak/deo2
index cd7b353..cd7b353 100644
--- a/include/01.pocetak/boot01.s
+++ b/include/01.pocetak/deo2
diff --git a/include/01.pocetak/deo3 b/include/01.pocetak/deo3
new file mode 100644
index 0000000..44fcb34
--- /dev/null
+++ b/include/01.pocetak/deo3
@@ -0,0 +1,6 @@
+.global _start
+.global load_gdt
+.global load_idt
+.global enable_interrupts
+.global ioport_in
+.global ioport_out
diff --git a/include/01.pocetak/deo4 b/include/01.pocetak/deo4
new file mode 100644
index 0000000..975ee19
--- /dev/null
+++ b/include/01.pocetak/deo4
@@ -0,0 +1,4 @@
+load_gdt:
+ movl 4(%esp), %edx
+ lgdt (%edx)
+ ret
diff --git a/include/01.pocetak/deo5 b/include/01.pocetak/deo5
new file mode 100644
index 0000000..6f095e9
--- /dev/null
+++ b/include/01.pocetak/deo5
@@ -0,0 +1,5 @@
+load_idt:
+ movl 4(%esp), %edx
+ lidt (%edx)
+ sti
+ ret
diff --git a/include/01.pocetak/deo6 b/include/01.pocetak/deo6
new file mode 100644
index 0000000..3f23d36
--- /dev/null
+++ b/include/01.pocetak/deo6
@@ -0,0 +1,4 @@
+ioport_in:
+ movl 4(%esp),%edx
+ in %dx,%al
+ ret
diff --git a/include/01.pocetak/deo7 b/include/01.pocetak/deo7
new file mode 100644
index 0000000..f441d17
--- /dev/null
+++ b/include/01.pocetak/deo7
@@ -0,0 +1,5 @@
+ioport_out:
+ movl 4(%esp),%edx
+ movl 8(%esp),%eax
+ outb %al,%dx
+ ret
diff --git a/include/01.pocetak/deo8 b/include/01.pocetak/deo8
new file mode 100644
index 0000000..cd3f772
--- /dev/null
+++ b/include/01.pocetak/deo8
@@ -0,0 +1,2 @@
+.set CODE_SEGMENT, 0x08
+.set DATA_SEGMENT, 0x10
diff --git a/include/01.pocetak/boot02.s b/include/01.pocetak/deo9
index a9280a6..a9280a6 100644
--- a/include/01.pocetak/boot02.s
+++ b/include/01.pocetak/deo9
diff --git a/include/02.vga/vga00.c b/include/02.vga/deo1
index dfee578..dfee578 100644
--- a/include/02.vga/vga00.c
+++ b/include/02.vga/deo1
diff --git a/include/02.vga/vga09.c b/include/02.vga/deo10
index 71e5b7d..9511b21 100644
--- a/include/02.vga/vga09.c
+++ b/include/02.vga/deo10
@@ -3,8 +3,8 @@ void terminal_putchar(char c)
if(c=='\n') terminal_column=0,terminal_row++;
else
{
- terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
- next_field();
+ terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
+ next_field();
}
if (terminal_row==VGA_HEIGHT) movescreen();
}
diff --git a/include/02.vga/vga10.c b/include/02.vga/deo11
index 8a757f4..8a757f4 100644
--- a/include/02.vga/vga10.c
+++ b/include/02.vga/deo11
diff --git a/include/02.vga/deo12 b/include/02.vga/deo12
new file mode 100644
index 0000000..be40f5a
--- /dev/null
+++ b/include/02.vga/deo12
@@ -0,0 +1,8 @@
+void terminal_writeint(uint32_t num)
+{
+ char string[100];
+ for(int i=0;i<100;i++) string[i]='\0';
+ char *str=string;
+ itos(num,str);
+ terminal_writestring(str);
+}
diff --git a/include/02.vga/deo13 b/include/02.vga/deo13
new file mode 100644
index 0000000..dfa3994
--- /dev/null
+++ b/include/02.vga/deo13
@@ -0,0 +1,8 @@
+void terminal_writefloat(double num)
+{
+ char string[100];
+ for(int i=0;i<100;i++) string[i]='\0';
+ char *str=string;
+ ftos(num,str);
+ terminal_writestring(str);
+}
diff --git a/include/02.vga/vga11.c b/include/02.vga/deo14
index efe6d3a..efe6d3a 100644
--- a/include/02.vga/vga11.c
+++ b/include/02.vga/deo14
diff --git a/include/02.vga/vga01.c b/include/02.vga/deo2
index be0ba00..be0ba00 100644
--- a/include/02.vga/vga01.c
+++ b/include/02.vga/deo2
diff --git a/include/02.vga/vga02.c b/include/02.vga/deo3
index 5a12424..5a12424 100644
--- a/include/02.vga/vga02.c
+++ b/include/02.vga/deo3
diff --git a/include/02.vga/vga03.c b/include/02.vga/deo4
index 173e598..173e598 100644
--- a/include/02.vga/vga03.c
+++ b/include/02.vga/deo4
diff --git a/include/02.vga/vga04.c b/include/02.vga/deo5
index 50a7d65..f4875e6 100644
--- a/include/02.vga/vga04.c
+++ b/include/02.vga/deo5
@@ -6,10 +6,10 @@ void terminal_initialize()
terminal_buffer=(uint16_t*) 0xB8000;
for(size_t y=0;y<VGA_HEIGHT;y++)
{
- for(size_t x=0;x<VGA_WIDTH;x++)
- {
- const size_t index=y*VGA_WIDTH+x;
- terminal_buffer[index]=vga_entry(' ', terminal_color);
- }
+ for(size_t x=0;x<VGA_WIDTH;x++)
+ {
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(' ', terminal_color);
+ }
}
}
diff --git a/include/02.vga/vga05.c b/include/02.vga/deo6
index 7079bf9..7079bf9 100644
--- a/include/02.vga/vga05.c
+++ b/include/02.vga/deo6
diff --git a/include/02.vga/vga06.c b/include/02.vga/deo7
index f00a403..2fbf259 100644
--- a/include/02.vga/vga06.c
+++ b/include/02.vga/deo7
@@ -1,5 +1,6 @@
void movescreen()
{
terminal_row--;
- for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j];
+ for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++)
+ terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j];
}
diff --git a/include/02.vga/vga07.c b/include/02.vga/deo8
index cfb7051..cfb7051 100644
--- a/include/02.vga/vga07.c
+++ b/include/02.vga/deo8
diff --git a/include/02.vga/vga08.c b/include/02.vga/deo9
index 6e1236d..6e1236d 100644
--- a/include/02.vga/vga08.c
+++ b/include/02.vga/deo9
diff --git a/include/02.vga/vga.c b/include/02.vga/vga.c
new file mode 100644
index 0000000..67c8b02
--- /dev/null
+++ b/include/02.vga/vga.c
@@ -0,0 +1,100 @@
+#include<types.h>
+#include<string.h>
+#include<asm.h>
+#include<vga.h>
+
+size_t terminal_row;
+size_t terminal_column;
+uint8_t terminal_color;
+uint16_t* terminal_buffer;
+
+void set_color(enum vga_color fg, enum vga_color bg)
+{
+ terminal_color = fg | bg << 4;
+}
+
+static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
+{
+ return (uint16_t) uc | (uint16_t) color << 8;
+}
+
+void terminal_initialize()
+{
+ terminal_row=0;
+ terminal_column=0;
+ set_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
+ terminal_buffer=(uint16_t*) 0xB8000;
+ for(size_t y=0;y<VGA_HEIGHT;y++)
+ {
+ for(size_t x=0;x<VGA_WIDTH;x++)
+ {
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(' ', terminal_color);
+ }
+ }
+}
+
+void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
+{
+ const size_t index=y*VGA_WIDTH+x;
+ terminal_buffer[index]=vga_entry(c, color);
+}
+
+void movescreen()
+{
+ terminal_row--;
+ for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++)
+ terminal_buffer[i*VGA_WIDTH+j]=terminal_buffer[(i+1)*VGA_WIDTH+j];
+}
+
+void next_field()
+{
+ if(++terminal_column==VGA_WIDTH) terminal_column=0,terminal_row++;
+}
+
+void previous_field()
+{
+ if(terminal_column) terminal_column--;
+ else terminal_row--,terminal_column=VGA_WIDTH-1;
+}
+
+void terminal_putchar(char c)
+{
+ if(c=='\n') terminal_column=0,terminal_row++;
+ else
+ {
+ terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
+ next_field();
+ }
+ if (terminal_row==VGA_HEIGHT) movescreen();
+}
+
+void terminal_writestring(char* data)
+{
+ for(int i=0;data[i]!='\0';i++) terminal_putchar(data[i]);
+}
+
+void terminal_writeint(uint32_t num)
+{
+ char string[100];
+ for(int i=0;i<100;i++) string[i]='\0';
+ char *str=string;
+ itos(num,str);
+ terminal_writestring(str);
+}
+
+void terminal_writefloat(double num)
+{
+ char string[100];
+ for(int i=0;i<100;i++) string[i]='\0';
+ char *str=string;
+ ftos(num,str);
+ terminal_writestring(str);
+}
+
+void clear()
+{
+ for(size_t i=0;i<VGA_HEIGHT;i++) for(size_t j=0;j<VGA_WIDTH;j++) terminal_putchar(' ');
+ terminal_column=0;
+ terminal_row=0;
+}
diff --git a/include/03.gdt/gdt00.c b/include/03.gdt/deo1
index c45e28b..c45e28b 100644
--- a/include/03.gdt/gdt00.c
+++ b/include/03.gdt/deo1
diff --git a/include/03.gdt/gdt01.c b/include/03.gdt/deo2
index cbc5e1d..cbc5e1d 100644
--- a/include/03.gdt/gdt01.c
+++ b/include/03.gdt/deo2
diff --git a/include/03.gdt/gdt02.c b/include/03.gdt/deo3
index e708661..e708661 100644
--- a/include/03.gdt/gdt02.c
+++ b/include/03.gdt/deo3
diff --git a/include/03.gdt/deo4 b/include/03.gdt/deo4
new file mode 100644
index 0000000..1abf809
--- /dev/null
+++ b/include/03.gdt/deo4
@@ -0,0 +1 @@
+extern void load_gdt(struct gdt_pointer *gdtp);
diff --git a/include/03.gdt/gdt03.c b/include/03.gdt/deo5
index 94c8cd3..ba7c6e2 100644
--- a/include/03.gdt/gdt03.c
+++ b/include/03.gdt/deo5
@@ -1,3 +1,2 @@
-extern void load_gdt(struct gdt_pointer *gdtp);
struct gdt_entry gdt[5];
struct gdt_pointer gdtp;
diff --git a/include/03.gdt/gdt04.c b/include/03.gdt/deo6
index 8d6a1f0..8d6a1f0 100644
--- a/include/03.gdt/gdt04.c
+++ b/include/03.gdt/deo6
diff --git a/include/03.gdt/deo7 b/include/03.gdt/deo7
new file mode 100644
index 0000000..d69d009
--- /dev/null
+++ b/include/03.gdt/deo7
@@ -0,0 +1,4 @@
+void init_gdt_table()
+{
+ gdtp.size=sizeof(gdt)-1;
+ gdtp.offset=(uint32_t)&gdt;
diff --git a/include/03.gdt/deo8 b/include/03.gdt/deo8
new file mode 100644
index 0000000..a122d84
--- /dev/null
+++ b/include/03.gdt/deo8
@@ -0,0 +1,5 @@
+ init_gdt_entry(0,0,0,0,0); // null segment
+ init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
+ init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
+ init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
+ init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
diff --git a/include/03.gdt/deo9 b/include/03.gdt/deo9
new file mode 100644
index 0000000..89736a5
--- /dev/null
+++ b/include/03.gdt/deo9
@@ -0,0 +1,2 @@
+ load_gdt(&gdtp);
+}
diff --git a/include/03.gdt/gdt.c b/include/03.gdt/gdt.c
new file mode 100644
index 0000000..e3d2b4c
--- /dev/null
+++ b/include/03.gdt/gdt.c
@@ -0,0 +1,46 @@
+#include<types.h>
+
+struct gdt_entry
+{
+ uint16_t limit;
+ uint16_t base1;
+ uint8_t base2;
+ uint8_t access;
+ uint8_t limit_flags;
+ uint8_t base3;
+} __attribute__((packed));
+
+struct gdt_pointer
+{
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
+
+extern void load_gdt(struct gdt_pointer *gdtp);
+
+struct gdt_entry gdt[5];
+struct gdt_pointer gdtp;
+
+void init_gdt_entry(size_t num, uint32_t limit, uint32_t base, uint8_t access, uint8_t limit_flags)
+{
+ gdt[num].limit=limit;
+ gdt[num].base1=(base & 0xffff);
+ gdt[num].base2=(base & 0xff0000) >> 16;
+ gdt[num].access=access;
+ gdt[num].limit_flags=limit_flags;
+ gdt[num].base3=(base & 0xff000000) >> 24;
+}
+
+void init_gdt_table()
+{
+ gdtp.size=sizeof(gdt)-1;
+ gdtp.offset=(uint32_t)&gdt;
+
+ init_gdt_entry(0,0,0,0,0); // null segment
+ init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
+ init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
+ init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
+ init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
+
+ load_gdt(&gdtp);
+}
diff --git a/include/03.gdt/gdt05.c b/include/03.gdt/gdt05.c
deleted file mode 100644
index d525a13..0000000
--- a/include/03.gdt/gdt05.c
+++ /dev/null
@@ -1,13 +0,0 @@
-void init_gdt_table()
-{
- gdtp.size=sizeof(gdt)-1;
- gdtp.offset=(uint32_t)&gdt;
-
- init_gdt_entry(0,0,0,0,0); // null segment
- init_gdt_entry(1,0xffffffff,0,0b10011010,0b11001111); // code segment
- init_gdt_entry(2,0xffffffff,0,0b10010010,0b11001111); // data segment
- init_gdt_entry(3,0xffffffff,0,0b11111010,0b11001111); // user mode code segment
- init_gdt_entry(4,0xffffffff,0,0b11110010,0b11001111); // user mode data segment
-
- load_gdt(&gdtp);
-}
diff --git a/include/04.idt/idt00.c b/include/04.idt/deo1
index 7c174c9..7c174c9 100644
--- a/include/04.idt/idt00.c
+++ b/include/04.idt/deo1
diff --git a/include/04.idt/idt06.c b/include/04.idt/deo10
index 409dd15..409dd15 100644
--- a/include/04.idt/idt06.c
+++ b/include/04.idt/deo10
diff --git a/include/05.irq/idt07.c b/include/04.idt/deo11
index a0d32d2..055e22a 100644
--- a/include/05.irq/idt07.c
+++ b/include/04.idt/deo11
@@ -10,6 +10,5 @@ void init_pic()
ioport_out(PIC2_DATA_PORT, 0x01);
ioport_out(PIC1_DATA_PORT, 0xff);
ioport_out(PIC2_DATA_PORT, 0xff);
-
ioport_out(PIC1_DATA_PORT, 0xFC);
}
diff --git a/include/05.irq/idt08.c b/include/04.idt/deo12
index d5754f7..ea57b35 100644
--- a/include/05.irq/idt08.c
+++ b/include/04.idt/deo12
@@ -35,10 +35,3 @@ void init_idt_table()
add_idt_entry(31,(uint32_t)irq31);
add_idt_entry(32,(uint32_t)timer_irq);
add_idt_entry(33,(uint32_t)keyboard_irq);
-
- idtp.size=sizeof(struct idt_entry)*256-1;
- idtp.offset=(uint32_t)&idt;
-
-
- load_idt(&idtp);
-}
diff --git a/include/04.idt/deo13 b/include/04.idt/deo13
new file mode 100644
index 0000000..427144b
--- /dev/null
+++ b/include/04.idt/deo13
@@ -0,0 +1,2 @@
+ idtp.size=sizeof(struct idt_entry)*256-1;
+ idtp.offset=(uint32_t)&idt;
diff --git a/include/04.idt/deo14 b/include/04.idt/deo14
new file mode 100644
index 0000000..8442fdc
--- /dev/null
+++ b/include/04.idt/deo14
@@ -0,0 +1,2 @@
+ load_idt(&idtp);
+}
diff --git a/include/04.idt/deo2 b/include/04.idt/deo2
new file mode 100644
index 0000000..afb8506
--- /dev/null
+++ b/include/04.idt/deo2
@@ -0,0 +1 @@
+#define INTERRUPT_GATE_32 0x8E
diff --git a/include/04.idt/deo3 b/include/04.idt/deo3
new file mode 100644
index 0000000..c564d8a
--- /dev/null
+++ b/include/04.idt/deo3
@@ -0,0 +1,2 @@
+#define KERNEL_CODE 0x08
+#define KERNEL_DATA 0x10
diff --git a/include/04.idt/idt01.c b/include/04.idt/deo4
index c2b91e5..ca70fa7 100644
--- a/include/04.idt/idt01.c
+++ b/include/04.idt/deo4
@@ -1,6 +1,3 @@
-#define INTERRUPT_GATE_32 0x8E
-#define KERNEL_CODE 0x08
-#define KERNEL_DATA 0x10
#define PIC1_COMMAND_PORT 0x20
#define PIC1_DATA_PORT 0x21
#define PIC2_COMMAND_PORT 0xA0
diff --git a/include/04.idt/idt02.c b/include/04.idt/deo5
index dcab25c..dcab25c 100644
--- a/include/04.idt/idt02.c
+++ b/include/04.idt/deo5
diff --git a/include/04.idt/idt03.c b/include/04.idt/deo6
index fe1bff5..fe1bff5 100644
--- a/include/04.idt/idt03.c
+++ b/include/04.idt/deo6
diff --git a/include/04.idt/idt04.c b/include/04.idt/deo7
index 329ce75..ffa0e82 100644
--- a/include/04.idt/idt04.c
+++ b/include/04.idt/deo7
@@ -1,4 +1,2 @@
extern void load_idt(struct idt_pointer *idtp);
extern void keyboard_irq();
-struct idt_entry idt[256];
-struct idt_pointer idtp;
diff --git a/include/04.idt/deo8 b/include/04.idt/deo8
new file mode 100644
index 0000000..28b2298
--- /dev/null
+++ b/include/04.idt/deo8
@@ -0,0 +1,2 @@
+struct idt_entry idt[256];
+struct idt_pointer idtp;
diff --git a/include/04.idt/idt05.c b/include/04.idt/deo9
index d11c19e..d11c19e 100644
--- a/include/04.idt/idt05.c
+++ b/include/04.idt/deo9
diff --git a/include/04.idt/idt.c b/include/04.idt/idt.c
new file mode 100644
index 0000000..843c9da
--- /dev/null
+++ b/include/04.idt/idt.c
@@ -0,0 +1,108 @@
+#include<types.h>
+#include<irq.h>
+#include<asm.h>
+
+#define INTERRUPT_GATE_32 0x8E
+
+#define KERNEL_CODE 0x08
+#define KERNEL_DATA 0x10
+
+#define PIC1_COMMAND_PORT 0x20
+#define PIC1_DATA_PORT 0x21
+#define PIC2_COMMAND_PORT 0xA0
+#define PIC2_DATA_PORT 0xA1
+
+struct idt_entry
+{
+ uint16_t offset1;
+ uint16_t selector;
+ uint8_t zero;
+ uint8_t type_attr;
+ uint16_t offset2;
+} __attribute__((packed));
+
+struct idt_pointer
+{
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
+
+
+extern void load_idt(struct idt_pointer *idtp);
+extern void keyboard_irq();
+
+struct idt_entry idt[256];
+struct idt_pointer idtp;
+
+void init_idt_entry(size_t num, uint32_t offset, uint16_t selector, uint8_t type_attr)
+{
+ idt[num].offset1=(offset & 0xffff);
+ idt[num].selector=selector;
+ idt[num].zero=0;
+ idt[num].type_attr=type_attr;
+ idt[num].offset2=(offset & 0xffff0000)>>16;
+}
+
+void add_idt_entry(size_t num,uint32_t offset)
+{
+ init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32);
+}
+
+void init_pic()
+{
+ ioport_out(PIC1_COMMAND_PORT, 0x11);
+ ioport_out(PIC2_COMMAND_PORT, 0x11);
+ ioport_out(PIC1_DATA_PORT, 0x20);
+ ioport_out(PIC2_DATA_PORT, 0x28);
+ ioport_out(PIC1_DATA_PORT, 0x04);
+ ioport_out(PIC2_DATA_PORT, 0x02);
+ ioport_out(PIC1_DATA_PORT, 0x01);
+ ioport_out(PIC2_DATA_PORT, 0x01);
+ ioport_out(PIC1_DATA_PORT, 0xff);
+ ioport_out(PIC2_DATA_PORT, 0xff);
+ ioport_out(PIC1_DATA_PORT, 0xFC);
+}
+
+void init_idt_table()
+{
+ init_pic();
+ add_idt_entry(0,(uint32_t)irq0);
+ add_idt_entry(1,(uint32_t)irq1);
+ add_idt_entry(2,(uint32_t)irq2);
+ add_idt_entry(3,(uint32_t)irq3);
+ add_idt_entry(4,(uint32_t)irq4);
+ add_idt_entry(5,(uint32_t)irq5);
+ add_idt_entry(6,(uint32_t)irq6);
+ add_idt_entry(7,(uint32_t)irq7);
+ add_idt_entry(8,(uint32_t)irq8);
+ add_idt_entry(9,(uint32_t)irq9);
+ add_idt_entry(10,(uint32_t)irq10);
+ add_idt_entry(11,(uint32_t)irq11);
+ add_idt_entry(12,(uint32_t)irq12);
+ add_idt_entry(13,(uint32_t)irq13);
+ add_idt_entry(14,(uint32_t)irq14);
+ add_idt_entry(15,(uint32_t)irq15);
+ add_idt_entry(16,(uint32_t)irq16);
+ add_idt_entry(17,(uint32_t)irq17);
+ add_idt_entry(18,(uint32_t)irq18);
+ add_idt_entry(19,(uint32_t)irq19);
+ add_idt_entry(20,(uint32_t)irq20);
+ add_idt_entry(21,(uint32_t)irq21);
+ add_idt_entry(22,(uint32_t)irq22);
+ add_idt_entry(23,(uint32_t)irq23);
+ add_idt_entry(24,(uint32_t)irq24);
+ add_idt_entry(25,(uint32_t)irq25);
+ add_idt_entry(26,(uint32_t)irq26);
+ add_idt_entry(27,(uint32_t)irq27);
+ add_idt_entry(28,(uint32_t)irq28);
+ add_idt_entry(29,(uint32_t)irq29);
+ add_idt_entry(30,(uint32_t)irq30);
+ add_idt_entry(31,(uint32_t)irq31);
+ add_idt_entry(32,(uint32_t)timer_irq);
+ add_idt_entry(33,(uint32_t)keyboard_irq);
+
+ idtp.size=sizeof(struct idt_entry)*256-1;
+ idtp.offset=(uint32_t)&idt;
+
+ load_idt(&idtp);
+}
diff --git a/include/06.keyboard/keyboard00.c b/include/06.keyboard/deo1
index 13fd550..13fd550 100644
--- a/include/06.keyboard/keyboard00.c
+++ b/include/06.keyboard/deo1
diff --git a/include/06.keyboard/deo10 b/include/06.keyboard/deo10
new file mode 100644
index 0000000..e5d558c
--- /dev/null
+++ b/include/06.keyboard/deo10
@@ -0,0 +1,18 @@
+void enter()
+{
+ printf("\n");
+ if(buffer_index>0)
+ {
+ tty(buffer[buffer_current]);
+ buffer_size[buffer_current]=buffer_index;
+ if(buffer_current==buffer_all) buffer_current=(++buffer_all);
+ else
+ {
+ for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0';
+ buffer_current=buffer_all;
+ }
+ buffer_index=0;
+ }
+ prompt();
+ return;
+}
diff --git a/include/06.keyboard/keyboard09.c b/include/06.keyboard/deo11
index 33bc64b..33bc64b 100644
--- a/include/06.keyboard/keyboard09.c
+++ b/include/06.keyboard/deo11
diff --git a/include/06.keyboard/deo12 b/include/06.keyboard/deo12
new file mode 100644
index 0000000..b40c42b
--- /dev/null
+++ b/include/06.keyboard/deo12
@@ -0,0 +1,11 @@
+void keyup()
+{
+ if(buffer_current>0)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current--;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
diff --git a/include/06.keyboard/deo13 b/include/06.keyboard/deo13
new file mode 100644
index 0000000..87b6e42
--- /dev/null
+++ b/include/06.keyboard/deo13
@@ -0,0 +1,11 @@
+void keydown()
+{
+ if(buffer_current<buffer_all)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current++;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
diff --git a/include/06.keyboard/deo14 b/include/06.keyboard/deo14
new file mode 100644
index 0000000..15df074
--- /dev/null
+++ b/include/06.keyboard/deo14
@@ -0,0 +1,3 @@
+void keyleft()
+{
+}
diff --git a/include/06.keyboard/deo15 b/include/06.keyboard/deo15
new file mode 100644
index 0000000..c7fca4c
--- /dev/null
+++ b/include/06.keyboard/deo15
@@ -0,0 +1,3 @@
+void keyright()
+{
+}
diff --git a/include/06.keyboard/deo16 b/include/06.keyboard/deo16
new file mode 100644
index 0000000..a55e9c2
--- /dev/null
+++ b/include/06.keyboard/deo16
@@ -0,0 +1,4 @@
+void keyboard_handler()
+{
+ ioport_out(PIC1_COMMAND_PORT, 0x20);
+ uint8_t status = ioport_in(KEYBOARD_STATUS_PORT);
diff --git a/include/06.keyboard/deo17 b/include/06.keyboard/deo17
new file mode 100644
index 0000000..ded0af2
--- /dev/null
+++ b/include/06.keyboard/deo17
@@ -0,0 +1,8 @@
+ if (status & 0x1)
+ {
+ uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT);
+ if(keycode<0x80)
+ {
+ char c=charcode[keycode];
+ ispressed[keycode]=1;
+ // printf("%d ",&keycode);
diff --git a/include/06.keyboard/deo18 b/include/06.keyboard/deo18
new file mode 100644
index 0000000..04688a9
--- /dev/null
+++ b/include/06.keyboard/deo18
@@ -0,0 +1,23 @@
+ switch(keycode)
+ {
+ case 0x0E:
+ backspace();
+ break;
+ case 0x1C:
+ enter();
+ break;
+ case 0x39:
+ space();
+ break;
+ case 72:
+ keyup();
+ break;
+ case 80:
+ keydown();
+ break;
+ case 75:
+ keyleft();
+ break;
+ case 77:
+ keyright();
+ break;
diff --git a/include/06.keyboard/deo19 b/include/06.keyboard/deo19
new file mode 100644
index 0000000..359ba30
--- /dev/null
+++ b/include/06.keyboard/deo19
@@ -0,0 +1,22 @@
+ default:
+ if(c!=' ')
+ {
+ if(ispressed[lctrl]||ispressed[rctrl])
+ {
+ if(c=='l')
+ {
+ clear();
+ prompt();
+ printf("%s",buffer[buffer_current]);
+ return;
+ }
+ }
+ if(ispressed[lshift]||ispressed[rshift])
+ {
+ c=shift_charcode[keycode];
+ }
+ buffer[buffer_current][buffer_index++]=c;
+ printf("%c",c);
+ }
+ break;
+ }
diff --git a/include/06.keyboard/keyboard01.c b/include/06.keyboard/deo2
index 50d7c07..50d7c07 100644
--- a/include/06.keyboard/keyboard01.c
+++ b/include/06.keyboard/deo2
diff --git a/include/06.keyboard/deo20 b/include/06.keyboard/deo20
new file mode 100644
index 0000000..d594130
--- /dev/null
+++ b/include/06.keyboard/deo20
@@ -0,0 +1,7 @@
+ }
+ else
+ {
+ ispressed[keycode-0x80]=0;
+ }
+ }
+}
diff --git a/include/06.keyboard/keyboard02.c b/include/06.keyboard/deo3
index 239c874..239c874 100644
--- a/include/06.keyboard/keyboard02.c
+++ b/include/06.keyboard/deo3
diff --git a/include/06.keyboard/keyboard03.c b/include/06.keyboard/deo4
index 3322fd7..3322fd7 100644
--- a/include/06.keyboard/keyboard03.c
+++ b/include/06.keyboard/deo4
diff --git a/include/06.keyboard/deo5 b/include/06.keyboard/deo5
new file mode 100644
index 0000000..57028c5
--- /dev/null
+++ b/include/06.keyboard/deo5
@@ -0,0 +1,7 @@
+char charcode[256];
+char shift_charcode[256];
+bool ispressed[128];
+#define lshift 0x2A
+#define rshift 0x36
+#define lctrl 0x1D
+#define rctrl 0x1D
diff --git a/include/06.keyboard/keyboard05.c b/include/06.keyboard/deo6
index 5c089ce..5c089ce 100644
--- a/include/06.keyboard/keyboard05.c
+++ b/include/06.keyboard/deo6
diff --git a/include/06.keyboard/keyboard06.c b/include/06.keyboard/deo7
index 55e04b8..55e04b8 100644
--- a/include/06.keyboard/keyboard06.c
+++ b/include/06.keyboard/deo7
diff --git a/include/06.keyboard/deo8 b/include/06.keyboard/deo8
new file mode 100644
index 0000000..95a5ac5
--- /dev/null
+++ b/include/06.keyboard/deo8
@@ -0,0 +1,3 @@
+void backspace()
+{
+ if(buffer_index<=0) return;
diff --git a/include/06.keyboard/keyboard07.c b/include/06.keyboard/deo9
index 480abb1..bc07378 100644
--- a/include/06.keyboard/keyboard07.c
+++ b/include/06.keyboard/deo9
@@ -1,7 +1,3 @@
-void backspace()
-{
- if(buffer_index<=0) return;
-
deletelast();
buffer[buffer_current][--buffer_index]='\0';
return;
diff --git a/include/06.keyboard/keyboard.c b/include/06.keyboard/keyboard.c
new file mode 100644
index 0000000..2218f09
--- /dev/null
+++ b/include/06.keyboard/keyboard.c
@@ -0,0 +1,182 @@
+#include<types.h>
+#include<asm.h>
+#include<stdio.h>
+
+#define BUFFER_SIZE 200
+#define BUFFER_LOG 200
+char buffer[BUFFER_LOG][BUFFER_SIZE];
+size_t buffer_size[BUFFER_LOG];
+size_t buffer_current=0;
+size_t buffer_all=0;
+size_t buffer_index=0;
+
+#define PIC1_COMMAND_PORT 0x20
+#define PIC1_DATA_PORT 0x21
+#define PIC2_COMMAND_PORT 0xA0
+#define PIC2_DATA_PORT 0xA1
+// IO Ports for Keyboard
+#define KEYBOARD_DATA_PORT 0x60
+#define KEYBOARD_STATUS_PORT 0x64
+
+void previous_field(void);
+void tty(char *buffer);
+void prompt(void);
+void clear();
+void us_en(char keymap[]);
+void us_en_shift(char keymap[]);
+
+char charcode[256];
+char shift_charcode[256];
+bool ispressed[128];
+#define lshift 0x2A
+#define rshift 0x36
+#define lctrl 0x1D
+#define rctrl 0x1D
+
+void init_keyboard()
+{
+ us_en(charcode);
+ us_en_shift(shift_charcode);
+}
+
+void deletelast()
+{
+ previous_field();
+ printf(" ");
+ previous_field();
+}
+
+void backspace()
+{
+ if(buffer_index<=0) return;
+
+ deletelast();
+ buffer[buffer_current][--buffer_index]='\0';
+ return;
+}
+
+void enter()
+{
+ printf("\n");
+ if(buffer_index>0)
+ {
+ tty(buffer[buffer_current]);
+ buffer_size[buffer_current]=buffer_index;
+ if(buffer_current==buffer_all) buffer_current=(++buffer_all);
+ else
+ {
+ for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0';
+ buffer_current=buffer_all;
+ }
+ buffer_index=0;
+ }
+ prompt();
+ return;
+}
+
+void space()
+{
+ buffer[buffer_current][buffer_index++]=' ';
+ printf(" ");
+}
+
+void keyup()
+{
+ if(buffer_current>0)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current--;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
+
+void keydown()
+{
+ if(buffer_current<buffer_all)
+ {
+ buffer_size[buffer_current]=buffer_index;
+ for(size_t i=0;i<buffer_index;i++) deletelast();
+ buffer_current++;
+ buffer_index=buffer_size[buffer_current];
+ printf("%s",buffer[buffer_current]);
+ }
+}
+
+void keyleft()
+{
+}
+
+void keyright()
+{
+}
+
+void keyboard_handler()
+{
+ ioport_out(PIC1_COMMAND_PORT, 0x20);
+ uint8_t status = ioport_in(KEYBOARD_STATUS_PORT);
+
+ if (status & 0x1)
+ {
+ uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT);
+ if(keycode<0x80)
+ {
+ char c=charcode[keycode];
+ ispressed[keycode]=1;
+ // printf("%d ",&keycode);
+
+ switch(keycode)
+ {
+ case 0x0E:
+ backspace();
+ break;
+ case 0x1C:
+ enter();
+ break;
+ case 0x39:
+ space();
+ break;
+ case 72:
+ keyup();
+ break;
+ case 80:
+ keydown();
+ break;
+ case 75:
+ keyleft();
+ break;
+ case 77:
+ keyright();
+ break;
+
+ default:
+ if(c!=' ')
+ {
+ if(ispressed[lctrl]||ispressed[rctrl])
+ {
+ if(c=='l')
+ {
+ clear();
+ prompt();
+ printf("%s",buffer[buffer_current]);
+ return;
+ }
+ }
+ if(ispressed[lshift]||ispressed[rshift])
+ {
+ c=shift_charcode[keycode];
+ }
+ buffer[buffer_current][buffer_index++]=c;
+ printf("%c",c);
+ }
+ break;
+ }
+
+ }
+ else
+ {
+ ispressed[keycode-0x80]=0;
+ }
+ }
+}
diff --git a/include/06.keyboard/keyboard04.c b/include/06.keyboard/keyboard04.c
deleted file mode 100644
index cc6e7d5..0000000
--- a/include/06.keyboard/keyboard04.c
+++ /dev/null
@@ -1,6 +0,0 @@
-char charcode[256];
-char shift_charcode[256];
-bool ispressed[128];
-#define lshift ispressed[0x2A]
-#define rshift ispressed[0x36]
-#define lctrl ispressed[0x1D]
diff --git a/include/06.keyboard/keyboard08.c b/include/06.keyboard/keyboard08.c
deleted file mode 100644
index 822e038..0000000
--- a/include/06.keyboard/keyboard08.c
+++ /dev/null
@@ -1,18 +0,0 @@
-void enter()
-{
- printf("\n");
- if(buffer_index>0)
- {
- tty(buffer[buffer_current]);
- buffer_size[buffer_current]=buffer_index;
- if(buffer_current==buffer_all) buffer_current=(++buffer_all);
- else
- {
- for(size_t i=0;i<BUFFER_SIZE;i++) buffer[buffer_all][i]='\0';
- buffer_current=buffer_all;
- }
- buffer_index=0;
- }
- prompt();
- return;
-}
diff --git a/include/06.keyboard/keyboard10.c b/include/06.keyboard/keyboard10.c
deleted file mode 100644
index 5c6d048..0000000
--- a/include/06.keyboard/keyboard10.c
+++ /dev/null
@@ -1,11 +0,0 @@
-void keyup()
-{
- if(buffer_current>0)
- {
- buffer_size[buffer_current]=buffer_index;
- for(size_t i=0;i<buffer_index;i++) deletelast();
- buffer_current--;
- buffer_index=buffer_size[buffer_current];
- printf("%s",buffer[buffer_current]);
- }
-}
diff --git a/include/06.keyboard/keyboard11.c b/include/06.keyboard/keyboard11.c
deleted file mode 100644
index 50841fa..0000000
--- a/include/06.keyboard/keyboard11.c
+++ /dev/null
@@ -1,11 +0,0 @@
-void keydown()
-{
- if(buffer_current<buffer_all)
- {
- buffer_size[buffer_current]=buffer_index;
- for(size_t i=0;i<buffer_index;i++) deletelast();
- buffer_current++;
- buffer_index=buffer_size[buffer_current];
- printf("%s",buffer[buffer_current]);
- }
-}
diff --git a/include/06.keyboard/keyboard12.c b/include/06.keyboard/keyboard12.c
deleted file mode 100644
index a0a8a0f..0000000
--- a/include/06.keyboard/keyboard12.c
+++ /dev/null
@@ -1,48 +0,0 @@
-void keyboard_handler()
-{
- ioport_out(PIC1_COMMAND_PORT, 0x20);
- uint8_t status = ioport_in(KEYBOARD_STATUS_PORT);
-
- if (status & 0x1)
- {
- uint8_t keycode = ioport_in(KEYBOARD_DATA_PORT);
- if(keycode<0x80)
- {
- ispressed[keycode]=1;
- if(keycode==0x0E) backspace();
- else if(keycode==0x1C) enter();
- else if(keycode==0x39) space();
- else if(keycode==72) keyup();
- else if(keycode==80) keydown();
- else if(keycode==75) keyleft();
- else if(keycode==77) keyright();
- else
- {
- char c=charcode[keycode];
- if(c!=' ')
- {
- if(lctrl)
- {
- if(c=='l')
- {
- clear();
- prompt();
- printf("%s",buffer[buffer_current]);
- return;
- }
- }
- if(lshift||rshift)
- {
- c=shift_charcode[keycode];
- }
- buffer[buffer_current][buffer_index++]=c;
- printf("%c",c);
- }
- }
- }
- else
- {
- ispressed[keycode-0x80]=0;
- }
- }
-}
diff --git a/include/07.pit/pit00.c b/include/07.pit/deo1
index 13fd550..13fd550 100644
--- a/include/07.pit/pit00.c
+++ b/include/07.pit/deo1
diff --git a/include/07.pit/deo10 b/include/07.pit/deo10
new file mode 100644
index 0000000..208a223
--- /dev/null
+++ b/include/07.pit/deo10
@@ -0,0 +1,4 @@
+ // Send the frequency divisor.
+ ioport_out(0x40, l);
+ ioport_out(0x40, h);
+}
diff --git a/include/07.pit/deo2 b/include/07.pit/deo2
new file mode 100644
index 0000000..dfa7284
--- /dev/null
+++ b/include/07.pit/deo2
@@ -0,0 +1 @@
+void add_idt_entry(size_t num,uint32_t offset);
diff --git a/include/07.pit/pit01.c b/include/07.pit/deo3
index c199373..025eb31 100644
--- a/include/07.pit/pit01.c
+++ b/include/07.pit/deo3
@@ -1,4 +1,3 @@
-void add_idt_entry(size_t num,uint32_t offset);
uint32_t tick=0;
const uint32_t TICKS_PER_SECOND=50;
extern uint32_t time;
diff --git a/include/07.pit/deo4 b/include/07.pit/deo4
new file mode 100644
index 0000000..8eba051
--- /dev/null
+++ b/include/07.pit/deo4
@@ -0,0 +1,9 @@
+void timer_handler()
+{
+ tick++;
+ if(tick==TICKS_PER_SECOND)
+ {
+ //printf("%d seconds passed\n",time);
+ tick=0;
+ time++;
+ }
diff --git a/include/07.pit/deo5 b/include/07.pit/deo5
new file mode 100644
index 0000000..eaf7bcf
--- /dev/null
+++ b/include/07.pit/deo5
@@ -0,0 +1,3 @@
+ ioport_out(0x20, 0x20);
+ ioport_out(0xa0,0x20);
+}
diff --git a/include/07.pit/deo6 b/include/07.pit/deo6
new file mode 100644
index 0000000..12cee6a
--- /dev/null
+++ b/include/07.pit/deo6
@@ -0,0 +1,3 @@
+void init_timer(uint32_t frequency)
+{
+ // Firstly, register our timer callback.
diff --git a/include/07.pit/deo7 b/include/07.pit/deo7
new file mode 100644
index 0000000..c780ebc
--- /dev/null
+++ b/include/07.pit/deo7
@@ -0,0 +1,4 @@
+ // The value we send to the PIT is the value to divide it's input clock
+ // (1193180 Hz) by, to get our required frequency. Important to note is
+ // that the divisor must be small enough to fit into 16-bits.
+ uint32_t divisor = 1193180 / frequency;
diff --git a/include/07.pit/deo8 b/include/07.pit/deo8
new file mode 100644
index 0000000..8c64aaf
--- /dev/null
+++ b/include/07.pit/deo8
@@ -0,0 +1,2 @@
+ // Send the command byte.
+ ioport_out(0x43, 0x36);
diff --git a/include/07.pit/deo9 b/include/07.pit/deo9
new file mode 100644
index 0000000..1deca04
--- /dev/null
+++ b/include/07.pit/deo9
@@ -0,0 +1,3 @@
+ // Divisor has to be sent byte-wise, so split here into upper/lower bytes.
+ uint8_t l = (uint8_t)(divisor & 0xFF);
+ uint8_t h = (uint8_t)( (divisor>>8) & 0xFF );
diff --git a/include/07.pit/pit02.c b/include/07.pit/pit02.c
deleted file mode 100644
index 523d14b..0000000
--- a/include/07.pit/pit02.c
+++ /dev/null
@@ -1,13 +0,0 @@
-void timer_handler()
-{
- tick++;
- if(tick==TICKS_PER_SECOND)
- {
- //printf("%d seconds passed\n",time);
- tick=0;
- time++;
- }
-
- ioport_out(0x20, 0x20);
- ioport_out(0xa0,0x20);
-}
diff --git a/include/07.pit/pit03.c b/include/07.pit/timer.c
index 287adba..390e512 100644
--- a/include/07.pit/pit03.c
+++ b/include/07.pit/timer.c
@@ -1,3 +1,28 @@
+#include<types.h>
+#include<asm.h>
+#include<stdio.h>
+
+void add_idt_entry(size_t num,uint32_t offset);
+
+uint32_t tick=0;
+const uint32_t TICKS_PER_SECOND=50;
+extern uint32_t time;
+uint32_t time=0;
+
+void timer_handler()
+{
+ tick++;
+ if(tick==TICKS_PER_SECOND)
+ {
+ //printf("%d seconds passed\n",time);
+ tick=0;
+ time++;
+ }
+
+ ioport_out(0x20, 0x20);
+ ioport_out(0xa0,0x20);
+}
+
void init_timer(uint32_t frequency)
{
// Firstly, register our timer callback.
diff --git a/include/08.heap/heap00.c b/include/08.heap/deo1
index c45e28b..c45e28b 100644
--- a/include/08.heap/heap00.c
+++ b/include/08.heap/deo1
diff --git a/include/08.heap/deo10 b/include/08.heap/deo10
new file mode 100644
index 0000000..fd64ff9
--- /dev/null
+++ b/include/08.heap/deo10
@@ -0,0 +1,5 @@
+ /* reserve room for bitmap */
+ bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize;
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 5;
+ }
diff --git a/include/08.heap/deo11 b/include/08.heap/deo11
new file mode 100644
index 0000000..a61193b
--- /dev/null
+++ b/include/08.heap/deo11
@@ -0,0 +1,4 @@
+ b->lfb = bcnt - 1;
+ b->used = bcnt;
+ return 1;
+}
diff --git a/include/08.heap/deo12 b/include/08.heap/deo12
new file mode 100644
index 0000000..84c5721
--- /dev/null
+++ b/include/08.heap/deo12
@@ -0,0 +1,5 @@
+static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) {
+ uint8_t c;
+ for (c = a + 1; c == b || c == 0; ++c);
+ return c;
+}
diff --git a/include/08.heap/deo13 b/include/08.heap/deo13
new file mode 100644
index 0000000..369c3f3
--- /dev/null
+++ b/include/08.heap/deo13
@@ -0,0 +1,7 @@
+void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) {
+ KHEAPBLOCKBM *b;
+ uint8_t *bm;
+ uint32_t bcnt;
+ uint32_t x, y, z;
+ uint32_t bneed;
+ uint8_t nid;
diff --git a/include/08.heap/deo14 b/include/08.heap/deo14
new file mode 100644
index 0000000..8bfb6f0
--- /dev/null
+++ b/include/08.heap/deo14
@@ -0,0 +1,4 @@
+ /* iterate blocks */
+ for (b = heap->fblock; b; b = b->next) {
+ /* check if block has enough room */
+ if (b->size - (b->used * b->bsize) >= size) {
diff --git a/include/08.heap/deo15 b/include/08.heap/deo15
new file mode 100644
index 0000000..a867821
--- /dev/null
+++ b/include/08.heap/deo15
@@ -0,0 +1,3 @@
+ bcnt = b->size / b->bsize;
+ bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize;
+ bm = (uint8_t*)&b[1];
diff --git a/include/08.heap/deo16 b/include/08.heap/deo16
new file mode 100644
index 0000000..78f4675
--- /dev/null
+++ b/include/08.heap/deo16
@@ -0,0 +1,5 @@
+ for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) {
+ /* just wrap around */
+ if (x >= bcnt) {
+ x = 0;
+ }
diff --git a/include/08.heap/deo17 b/include/08.heap/deo17
new file mode 100644
index 0000000..d20be4c
--- /dev/null
+++ b/include/08.heap/deo17
@@ -0,0 +1,3 @@
+ if (bm[x] == 0) {
+ /* count free blocks */
+ for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y);
diff --git a/include/08.heap/deo18 b/include/08.heap/deo18
new file mode 100644
index 0000000..fed8463
--- /dev/null
+++ b/include/08.heap/deo18
@@ -0,0 +1,4 @@
+ /* we have enough, now allocate them */
+ if (y == bneed) {
+ /* find ID that does not match left or right */
+ nid = k_heapBMGetNID(bm[x - 1], bm[x + y]);
diff --git a/include/08.heap/deo19 b/include/08.heap/deo19
new file mode 100644
index 0000000..9b49484
--- /dev/null
+++ b/include/08.heap/deo19
@@ -0,0 +1,4 @@
+ /* allocate by setting id */
+ for (z = 0; z < y; ++z) {
+ bm[x + z] = nid;
+ }
diff --git a/include/08.heap/deo2 b/include/08.heap/deo2
new file mode 100644
index 0000000..2a69314
--- /dev/null
+++ b/include/08.heap/deo2
@@ -0,0 +1,7 @@
+typedef struct _KHEAPBLOCKBM {
+ struct _KHEAPBLOCKBM *next;
+ uint32_t size;
+ uint32_t used;
+ uint32_t bsize;
+ uint32_t lfb;
+} KHEAPBLOCKBM;
diff --git a/include/08.heap/deo20 b/include/08.heap/deo20
new file mode 100644
index 0000000..f141368
--- /dev/null
+++ b/include/08.heap/deo20
@@ -0,0 +1,2 @@
+ /* optimization */
+ b->lfb = (x + bneed) - 2;
diff --git a/include/08.heap/deo21 b/include/08.heap/deo21
new file mode 100644
index 0000000..8fd73e2
--- /dev/null
+++ b/include/08.heap/deo21
@@ -0,0 +1,2 @@
+ /* count used blocks NOT bytes */
+ b->used += y;
diff --git a/include/08.heap/deo22 b/include/08.heap/deo22
new file mode 100644
index 0000000..98c1157
--- /dev/null
+++ b/include/08.heap/deo22
@@ -0,0 +1,2 @@
+ return (void*)(x * b->bsize + (uintptr_t)&b[1]);
+ }
diff --git a/include/08.heap/deo23 b/include/08.heap/deo23
new file mode 100644
index 0000000..21aa8c8
--- /dev/null
+++ b/include/08.heap/deo23
@@ -0,0 +1,9 @@
+ /* x will be incremented by one ONCE more in our FOR loop */
+ x += (y - 1);
+ continue;
+ }
+ }
+ }
+ }
+ return 0;
+}
diff --git a/include/08.heap/deo24 b/include/08.heap/deo24
new file mode 100644
index 0000000..e9c116b
--- /dev/null
+++ b/include/08.heap/deo24
@@ -0,0 +1,7 @@
+void k_heapBMFree(KHEAPBM *heap, void *ptr) {
+ KHEAPBLOCKBM *b;
+ uintptr_t ptroff;
+ uint32_t bi, x;
+ uint8_t *bm;
+ uint8_t id;
+ uint32_t max;
diff --git a/include/08.heap/deo25 b/include/08.heap/deo25
new file mode 100644
index 0000000..1a22151
--- /dev/null
+++ b/include/08.heap/deo25
@@ -0,0 +1,20 @@
+ for (b = heap->fblock; b; b = b->next) {
+ if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) {
+ /* found block */
+ ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */
+ /* block offset in BM */
+ bi = ptroff / b->bsize;
+ /* .. */
+ bm = (uint8_t*)&b[1];
+ /* clear allocation */
+ id = bm[bi];
+ /* oddly.. GCC did not optimize this */
+ max = b->size / b->bsize;
+ for (x = bi; bm[x] == id && x < max; ++x) {
+ bm[x] = 0;
+ }
+ /* update free block count */
+ b->used -= x - bi;
+ return;
+ }
+ }
diff --git a/include/08.heap/deo26 b/include/08.heap/deo26
new file mode 100644
index 0000000..11a4697
--- /dev/null
+++ b/include/08.heap/deo26
@@ -0,0 +1,3 @@
+ /* this error needs to be raised or reported somehow */
+ return;
+}
diff --git a/include/08.heap/deo27 b/include/08.heap/deo27
new file mode 100644
index 0000000..6ac75a9
--- /dev/null
+++ b/include/08.heap/deo27
@@ -0,0 +1 @@
+KHEAPBM kheap;
diff --git a/include/08.heap/deo28 b/include/08.heap/deo28
new file mode 100644
index 0000000..6d7223d
--- /dev/null
+++ b/include/08.heap/deo28
@@ -0,0 +1,4 @@
+void kheapinit()
+{
+ k_heapBMInit(&kheap);
+}
diff --git a/include/08.heap/heap08.c b/include/08.heap/deo29
index 05cf132..de767a2 100644
--- a/include/08.heap/heap08.c
+++ b/include/08.heap/deo29
@@ -1,8 +1,3 @@
-KHEAPBM kheap;
-void kheapinit()
-{
- k_heapBMInit(&kheap);
-}
int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize)
{
return k_heapBMAddBlock(&kheap,addr,size,bsize);
diff --git a/include/08.heap/heap02.c b/include/08.heap/deo3
index e46dc38..d07786d 100644
--- a/include/08.heap/heap02.c
+++ b/include/08.heap/deo3
@@ -1,3 +1,3 @@
typedef struct _KHEAPBM {
- KHEAPBLOCKBM *fblock;
+ KHEAPBLOCKBM *fblock;
} KHEAPBM;
diff --git a/include/08.heap/heap09.c b/include/08.heap/deo30
index 6874578..22972f4 100644
--- a/include/08.heap/heap09.c
+++ b/include/08.heap/deo30
@@ -1,9 +1,4 @@
void *kmalloc(uint32_t size)
{
return k_heapBMAlloc(&kheap,size);
-
-}
-void kfree(void *ptr)
-{
- k_heapBMFree(&kheap,ptr);
}
diff --git a/include/08.heap/deo31 b/include/08.heap/deo31
new file mode 100644
index 0000000..d4d5941
--- /dev/null
+++ b/include/08.heap/deo31
@@ -0,0 +1,4 @@
+void kfree(void *ptr)
+{
+ k_heapBMFree(&kheap,ptr);
+}
diff --git a/include/08.heap/heap03.c b/include/08.heap/deo4
index 9e2fe89..c2dc3b5 100644
--- a/include/08.heap/heap03.c
+++ b/include/08.heap/deo4
@@ -1,3 +1,3 @@
void k_heapBMInit(KHEAPBM *heap) {
- heap->fblock = 0;
+ heap->fblock = 0;
}
diff --git a/include/08.heap/deo5 b/include/08.heap/deo5
new file mode 100644
index 0000000..8eda156
--- /dev/null
+++ b/include/08.heap/deo5
@@ -0,0 +1,5 @@
+int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) {
+ KHEAPBLOCKBM *b;
+ uint32_t bcnt;
+ uint32_t x;
+ uint8_t *bm;
diff --git a/include/08.heap/deo6 b/include/08.heap/deo6
new file mode 100644
index 0000000..024a09a
--- /dev/null
+++ b/include/08.heap/deo6
@@ -0,0 +1,3 @@
+ b = (KHEAPBLOCKBM*)addr;
+ b->size = size - sizeof(KHEAPBLOCKBM);
+ b->bsize = bsize;
diff --git a/include/08.heap/deo7 b/include/08.heap/deo7
new file mode 100644
index 0000000..c816b2c
--- /dev/null
+++ b/include/08.heap/deo7
@@ -0,0 +1,2 @@
+ b->next = heap->fblock;
+ heap->fblock = b;
diff --git a/include/08.heap/deo8 b/include/08.heap/deo8
new file mode 100644
index 0000000..3a9ea03
--- /dev/null
+++ b/include/08.heap/deo8
@@ -0,0 +1,2 @@
+ bcnt = b->size / b->bsize;
+ bm = (uint8_t*)&b[1];
diff --git a/include/08.heap/deo9 b/include/08.heap/deo9
new file mode 100644
index 0000000..7183948
--- /dev/null
+++ b/include/08.heap/deo9
@@ -0,0 +1,4 @@
+ /* clear bitmap */
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 0;
+ }
diff --git a/include/08.heap/heap.c b/include/08.heap/heap.c
new file mode 100644
index 0000000..99d0a37
--- /dev/null
+++ b/include/08.heap/heap.c
@@ -0,0 +1,166 @@
+#include<types.h>
+
+typedef struct _KHEAPBLOCKBM {
+ struct _KHEAPBLOCKBM *next;
+ uint32_t size;
+ uint32_t used;
+ uint32_t bsize;
+ uint32_t lfb;
+} KHEAPBLOCKBM;
+
+typedef struct _KHEAPBM {
+ KHEAPBLOCKBM *fblock;
+} KHEAPBM;
+
+void k_heapBMInit(KHEAPBM *heap) {
+ heap->fblock = 0;
+}
+
+int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) {
+ KHEAPBLOCKBM *b;
+ uint32_t bcnt;
+ uint32_t x;
+ uint8_t *bm;
+
+ b = (KHEAPBLOCKBM*)addr;
+ b->size = size - sizeof(KHEAPBLOCKBM);
+ b->bsize = bsize;
+
+ b->next = heap->fblock;
+ heap->fblock = b;
+
+ bcnt = b->size / b->bsize;
+ bm = (uint8_t*)&b[1];
+
+ /* clear bitmap */
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 0;
+ }
+
+ /* reserve room for bitmap */
+ bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize;
+ for (x = 0; x < bcnt; ++x) {
+ bm[x] = 5;
+ }
+
+ b->lfb = bcnt - 1;
+ b->used = bcnt;
+ return 1;
+}
+
+static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) {
+ uint8_t c;
+ for (c = a + 1; c == b || c == 0; ++c);
+ return c;
+}
+
+void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) {
+ KHEAPBLOCKBM *b;
+ uint8_t *bm;
+ uint32_t bcnt;
+ uint32_t x, y, z;
+ uint32_t bneed;
+ uint8_t nid;
+
+ /* iterate blocks */
+ for (b = heap->fblock; b; b = b->next) {
+ /* check if block has enough room */
+ if (b->size - (b->used * b->bsize) >= size) {
+
+ bcnt = b->size / b->bsize;
+ bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize;
+ bm = (uint8_t*)&b[1];
+
+ for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) {
+ /* just wrap around */
+ if (x >= bcnt) {
+ x = 0;
+ }
+
+ if (bm[x] == 0) {
+ /* count free blocks */
+ for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y);
+
+ /* we have enough, now allocate them */
+ if (y == bneed) {
+ /* find ID that does not match left or right */
+ nid = k_heapBMGetNID(bm[x - 1], bm[x + y]);
+
+ /* allocate by setting id */
+ for (z = 0; z < y; ++z) {
+ bm[x + z] = nid;
+ }
+
+ /* optimization */
+ b->lfb = (x + bneed) - 2;
+
+ /* count used blocks NOT bytes */
+ b->used += y;
+
+ return (void*)(x * b->bsize + (uintptr_t)&b[1]);
+ }
+
+ /* x will be incremented by one ONCE more in our FOR loop */
+ x += (y - 1);
+ continue;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+void k_heapBMFree(KHEAPBM *heap, void *ptr) {
+ KHEAPBLOCKBM *b;
+ uintptr_t ptroff;
+ uint32_t bi, x;
+ uint8_t *bm;
+ uint8_t id;
+ uint32_t max;
+
+ for (b = heap->fblock; b; b = b->next) {
+ if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) {
+ /* found block */
+ ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */
+ /* block offset in BM */
+ bi = ptroff / b->bsize;
+ /* .. */
+ bm = (uint8_t*)&b[1];
+ /* clear allocation */
+ id = bm[bi];
+ /* oddly.. GCC did not optimize this */
+ max = b->size / b->bsize;
+ for (x = bi; bm[x] == id && x < max; ++x) {
+ bm[x] = 0;
+ }
+ /* update free block count */
+ b->used -= x - bi;
+ return;
+ }
+ }
+
+ /* this error needs to be raised or reported somehow */
+ return;
+}
+
+KHEAPBM kheap;
+
+void kheapinit()
+{
+ k_heapBMInit(&kheap);
+}
+
+int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize)
+{
+ return k_heapBMAddBlock(&kheap,addr,size,bsize);
+}
+
+void *kmalloc(uint32_t size)
+{
+ return k_heapBMAlloc(&kheap,size);
+}
+
+void kfree(void *ptr)
+{
+ k_heapBMFree(&kheap,ptr);
+}
diff --git a/include/08.heap/heap01.c b/include/08.heap/heap01.c
deleted file mode 100644
index e7f4f84..0000000
--- a/include/08.heap/heap01.c
+++ /dev/null
@@ -1,7 +0,0 @@
-typedef struct _KHEAPBLOCKBM {
- struct _KHEAPBLOCKBM *next;
- uint32_t size;
- uint32_t used;
- uint32_t bsize;
- uint32_t lfb;
-} KHEAPBLOCKBM;
diff --git a/include/08.heap/heap04.c b/include/08.heap/heap04.c
deleted file mode 100644
index be39951..0000000
--- a/include/08.heap/heap04.c
+++ /dev/null
@@ -1,33 +0,0 @@
-int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) {
- KHEAPBLOCKBM *b;
- uint32_t bcnt;
- uint32_t x;
- uint8_t *bm;
-
- b = (KHEAPBLOCKBM*)addr;
- b->size = size - sizeof(KHEAPBLOCKBM);
- b->bsize = bsize;
-
- b->next = heap->fblock;
- heap->fblock = b;
-
- bcnt = b->size / b->bsize;
- bm = (uint8_t*)&b[1];
-
- /* clear bitmap */
- for (x = 0; x < bcnt; ++x) {
- bm[x] = 0;
- }
-
- /* reserve room for bitmap */
- bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize;
- for (x = 0; x < bcnt; ++x) {
- bm[x] = 5;
- }
-
- b->lfb = bcnt - 1;
-
- b->used = bcnt;
-
- return 1;
-}
diff --git a/include/08.heap/heap05.c b/include/08.heap/heap05.c
deleted file mode 100644
index 1856ca5..0000000
--- a/include/08.heap/heap05.c
+++ /dev/null
@@ -1,5 +0,0 @@
-static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) {
- uint8_t c;
- for (c = a + 1; c == b || c == 0; ++c);
- return c;
-}
diff --git a/include/08.heap/heap06.c b/include/08.heap/heap06.c
deleted file mode 100644
index 5ad2787..0000000
--- a/include/08.heap/heap06.c
+++ /dev/null
@@ -1,58 +0,0 @@
-void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) {
- KHEAPBLOCKBM *b;
- uint8_t *bm;
- uint32_t bcnt;
- uint32_t x, y, z;
- uint32_t bneed;
- uint8_t nid;
-
- /* iterate blocks */
- for (b = heap->fblock; b; b = b->next) {
- //printf("size:%d,used:%d,bsize:%d,lfb:%d\n",b->size,b->used,b->bsize,b->lfb);
- /* check if block has enough room */
- if (b->size - (b->used * b->bsize) >= size) {
-
- bcnt = b->size / b->bsize;
- bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize;
- bm = (uint8_t*)&b[1];
- //printf("bcnt:%d,bneed:%d,bm:%d\n",bcnt,bneed,bm);
-
- for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) {
- /* just wrap around */
- if (x >= bcnt) {
- x = 0;
- }
-
- if (bm[x] == 0) {
- /* count free blocks */
- for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y);
-
- /* we have enough, now allocate them */
- if (y == bneed) {
- /* find ID that does not match left or right */
- nid = k_heapBMGetNID(bm[x - 1], bm[x + y]);
-
- /* allocate by setting id */
- for (z = 0; z < y; ++z) {
- bm[x + z] = nid;
- }
-
- /* optimization */
- b->lfb = (x + bneed) - 2;
-
- /* count used blocks NOT bytes */
- b->used += y;
-
- return (void*)(x * b->bsize + (uintptr_t)&b[1]);
- }
-
- /* x will be incremented by one ONCE more in our FOR loop */
- x += (y - 1);
- continue;
- }
- }
- }
- }
-
- return 0;
-}
diff --git a/include/08.heap/heap07.c b/include/08.heap/heap07.c
deleted file mode 100644
index 5686cd4..0000000
--- a/include/08.heap/heap07.c
+++ /dev/null
@@ -1,32 +0,0 @@
-void k_heapBMFree(KHEAPBM *heap, void *ptr) {
- KHEAPBLOCKBM *b;
- uintptr_t ptroff;
- uint32_t bi, x;
- uint8_t *bm;
- uint8_t id;
- uint32_t max;
-
- for (b = heap->fblock; b; b = b->next) {
- if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) {
- /* found block */
- ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */
- /* block offset in BM */
- bi = ptroff / b->bsize;
- /* .. */
- bm = (uint8_t*)&b[1];
- /* clear allocation */
- id = bm[bi];
- /* oddly.. GCC did not optimize this */
- max = b->size / b->bsize;
- for (x = bi; bm[x] == id && x < max; ++x) {
- bm[x] = 0;
- }
- /* update free block count */
- b->used -= x - bi;
- return;
- }
- }
-
- /* this error needs to be raised or reported somehow */
- return;
-}
diff --git a/include/09.paging/paging00.c b/include/09.paging/deo1
index c45e28b..c45e28b 100644
--- a/include/09.paging/paging00.c
+++ b/include/09.paging/deo1
diff --git a/include/09.paging/paging01.c b/include/09.paging/deo2
index 0789338..b56d18e 100644
--- a/include/09.paging/paging01.c
+++ b/include/09.paging/deo2
@@ -1,3 +1,2 @@
extern void loadPageDirectory(uint32_t*);
extern void enablePaging();
-uint32_t page_directory[1024] __attribute__((aligned(4096)));
diff --git a/include/09.paging/deo3 b/include/09.paging/deo3
new file mode 100644
index 0000000..cbfbd25
--- /dev/null
+++ b/include/09.paging/deo3
@@ -0,0 +1 @@
+uint32_t page_directory[1024] __attribute__((aligned(4096)));
diff --git a/include/09.paging/deo4 b/include/09.paging/deo4
new file mode 100644
index 0000000..6905d35
--- /dev/null
+++ b/include/09.paging/deo4
@@ -0,0 +1,12 @@
+void set_pd()
+{
+ //set each entry to not present
+ for(size_t i=0;i<1024;i++)
+ {
+ // This sets the following flags to the pages:
+ // Supervisor: Only kernel-mode can access them
+ // Write Enabled: It can be both read from and written to
+ // Not Present: The page table is not present
+ page_directory[i] = 0x00000002;
+ }
+}
diff --git a/include/09.paging/paging03.c b/include/09.paging/deo5
index 57f997d..57f997d 100644
--- a/include/09.paging/paging03.c
+++ b/include/09.paging/deo5
diff --git a/include/09.paging/deo6 b/include/09.paging/deo6
new file mode 100644
index 0000000..4e670bb
--- /dev/null
+++ b/include/09.paging/deo6
@@ -0,0 +1,4 @@
+void set_pt(size_t num,uint32_t address)
+{
+ // holds the physical address where we want to start mapping these pages to.
+ // in this case, we want to map these pages to the very beginning of memory.
diff --git a/include/09.paging/deo7 b/include/09.paging/deo7
new file mode 100644
index 0000000..5898f28
--- /dev/null
+++ b/include/09.paging/deo7
@@ -0,0 +1,7 @@
+ //we will fill all 1024 entries in the table, mapping 4 megabytes
+ for(size_t i=0;i<1024;i++)
+ {
+ // As the address is page aligned, it will always leave 12 bits zeroed.
+ // Those bits are used by the attributes ;)
+ page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
+ }
diff --git a/include/09.paging/deo8 b/include/09.paging/deo8
new file mode 100644
index 0000000..b842a0c
--- /dev/null
+++ b/include/09.paging/deo8
@@ -0,0 +1,3 @@
+ page_directory[num] = ((uint32_t)page_table[num]) | 3;
+ // attributes: supervisor level, read/write, present
+}
diff --git a/include/09.paging/paging05.c b/include/09.paging/deo9
index d99797b..d99797b 100644
--- a/include/09.paging/paging05.c
+++ b/include/09.paging/deo9
diff --git a/include/09.paging/paging.c b/include/09.paging/paging.c
new file mode 100644
index 0000000..f08530d
--- /dev/null
+++ b/include/09.paging/paging.c
@@ -0,0 +1,46 @@
+#include<types.h>
+
+extern void loadPageDirectory(uint32_t*);
+extern void enablePaging();
+
+uint32_t page_directory[1024] __attribute__((aligned(4096)));
+
+void set_pd()
+{
+ //set each entry to not present
+ for(size_t i=0;i<1024;i++)
+ {
+ // This sets the following flags to the pages:
+ // Supervisor: Only kernel-mode can access them
+ // Write Enabled: It can be both read from and written to
+ // Not Present: The page table is not present
+ page_directory[i] = 0x00000002;
+ }
+}
+
+uint32_t page_table[1024][1024] __attribute__((aligned(4096)));
+
+void set_pt(size_t num,uint32_t address)
+{
+ // holds the physical address where we want to start mapping these pages to.
+ // in this case, we want to map these pages to the very beginning of memory.
+
+ //we will fill all 1024 entries in the table, mapping 4 megabytes
+ for(size_t i=0;i<1024;i++)
+ {
+ // As the address is page aligned, it will always leave 12 bits zeroed.
+ // Those bits are used by the attributes ;)
+ page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
+ }
+
+ page_directory[num] = ((uint32_t)page_table[num]) | 3;
+ // attributes: supervisor level, read/write, present
+}
+
+void set_paging()
+{
+ set_pd();
+ for(size_t i=0;i<1024;i++) set_pt(i,0x00400000 * i); // all 4GB mapped
+ loadPageDirectory(page_directory);
+ enablePaging();
+}
diff --git a/include/09.paging/paging02.c b/include/09.paging/paging02.c
deleted file mode 100644
index 8c00c89..0000000
--- a/include/09.paging/paging02.c
+++ /dev/null
@@ -1,12 +0,0 @@
-void set_pd()
-{
- //set each entry to not present
- for(size_t i=0;i<1024;i++)
- {
- // This sets the following flags to the pages:
- // Supervisor: Only kernel-mode can access them
- // Write Enabled: It can be both read from and written to
- // Not Present: The page table is not present
- page_directory[i] = 0x00000002;
- }
-}
diff --git a/include/09.paging/paging04.c b/include/09.paging/paging04.c
deleted file mode 100644
index ad7507f..0000000
--- a/include/09.paging/paging04.c
+++ /dev/null
@@ -1,15 +0,0 @@
-void set_pt(size_t num,uint32_t address)
-{
- // holds the physical address where we want to start mapping these pages to.
- // in this case, we want to map these pages to the very beginning of memory.
- //we will fill all 1024 entries in the table, mapping 4 megabytes
- for(size_t i=0;i<1024;i++)
- {
- // As the address is page aligned, it will always leave 12 bits zeroed.
- // Those bits are used by the attributes ;)
- page_table[num][i] = (address + i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
- }
-
- page_directory[num] = ((uint32_t)page_table[num]) | 3;
- // attributes: supervisor level, read/write, present
-}
diff --git a/include/10.libc/stdio.h b/include/10.libc/stdio.h
index 45c9215..6bb87be 100644
--- a/include/10.libc/stdio.h
+++ b/include/10.libc/stdio.h
@@ -1,12 +1,12 @@
#ifndef _STDIO_H
#define _STDIO_H
+
#include <stdarg.h>
#include <stddef.h>
+
#define SEEK_SET 0
typedef struct { int unused; } FILE;
-#ifdef __cplusplus
-extern "C" {
-#endif
+
extern FILE* stderr;
#define stderr stderr
int fclose(FILE*);
@@ -22,7 +22,4 @@ int vfprintf(FILE*, const char*, va_list);
void printf(char *str, ...);
-#ifdef __cplusplus
-}
-#endif
#endif
diff --git a/include/10.libc/stdlib.h b/include/10.libc/stdlib.h
index a0afe38..77ffa67 100644
--- a/include/10.libc/stdlib.h
+++ b/include/10.libc/stdlib.h
@@ -1,15 +1,11 @@
#ifndef _STDLIB_H
#define _STDLIB_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+
void abort(void);
int atexit(void (*)(void));
int atoi(const char*);
void free(void*);
char* getenv(const char*);
void* malloc(size_t);
-#ifdef __cplusplus
-}
-#endif
+
#endif
diff --git a/include/10.libc/string.h b/include/10.libc/string.h
index bef5854..78fa956 100644
--- a/include/10.libc/string.h
+++ b/include/10.libc/string.h
@@ -1,16 +1,12 @@
#ifndef _STRING_H
#define _STRING_H
+
#include <stddef.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+
void* memcpy(void*, const void*, size_t);
void* memset(void*, int, size_t);
char* strcpy(char*, const char*);
size_t strlen(const char*);
-#ifdef __cplusplus
-}
-#endif
#include<types.h>
diff --git a/include/10.libc/sys/types.h b/include/10.libc/sys/types.h
index 4f55189..34c1b65 100644
--- a/include/10.libc/sys/types.h
+++ b/include/10.libc/sys/types.h
@@ -1,4 +1,6 @@
#ifndef _SYS_TYPES_H
#define _SYS_TYPES_H
+
typedef int pid_t;
+
#endif
diff --git a/include/10.libc/unistd.h b/include/10.libc/unistd.h
index a6bfee0..abe7f3c 100644
--- a/include/10.libc/unistd.h
+++ b/include/10.libc/unistd.h
@@ -1,14 +1,11 @@
#ifndef _UNISTD_H
#define _UNISTD_H
+
#include <sys/types.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
+
int execv(const char*, char* const[]);
int execve(const char*, char* const[], char* const[]);
int execvp(const char*, char* const[]);
pid_t fork(void);
-#ifdef __cplusplus
-}
-#endif
+
#endif
diff --git a/include/setup.sh b/include/setup.sh
new file mode 100755
index 0000000..adc27cb
--- /dev/null
+++ b/include/setup.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+rm -rf "01.pocetak" "02.vga" "03.gdt" "04.idt" "05.irq" "06.keyboard" "07.pit" "08.heap" "09.paging" "10.libc"
+
+mkdir "01.pocetak" "02.vga" "03.gdt" "04.idt" "05.irq" "06.keyboard" "07.pit" "08.heap" "09.paging" "10.libc"
+
+cp ../../mykernel/src/as/boot.s ./01.pocetak
+cd 01.pocetak || exit
+awk -v RS= '{print > ("deo" NR )}' boot.s
+cd .. || exit
+
+cp ../../mykernel/src/c/vga.c ./02.vga
+cd 02.vga || exit
+awk -v RS= '{print > ("deo" NR )}' vga.c
+cd .. || exit
+
+cp ../../mykernel/src/c/gdt.c ./03.gdt
+cd 03.gdt || exit
+awk -v RS= '{print > ("deo" NR )}' gdt.c
+cd .. || exit
+
+cp ../../mykernel/src/c/idt.c ./04.idt
+cd 04.idt || exit
+awk -v RS= '{print > ("deo" NR )}' idt.c
+cd .. || exit
+
+cp ../../mykernel/src/c/keyboard.c ./06.keyboard
+cd 06.keyboard || exit
+awk -v RS= '{print > ("deo" NR )}' keyboard.c
+cd .. || exit
+
+cp ../../mykernel/src/c/timer.c ./07.pit
+cd 07.pit || exit
+awk -v RS= '{print > ("deo" NR )}' timer.c
+cd .. || exit
+
+cp ../../mykernel/src/c/heap.c ./08.heap
+cd 08.heap || exit
+awk -v RS= '{print > ("deo" NR )}' heap.c
+cd .. || exit
+
+cp ../../mykernel/src/c/paging.c ./09.paging
+cd 09.paging || exit
+awk -v RS= '{print > ("deo" NR )}' paging.c
+cd .. || exit
+
+cp -r ../../mykernel/src/include/* ./10.libc
diff --git a/kernel.pdf b/kernel.pdf
index 02988f5..d5c3b07 100644
--- a/kernel.pdf
+++ b/kernel.pdf
Binary files differ
diff --git a/kernel.tex b/kernel.tex
index 8ca59d8..22ab606 100644
--- a/kernel.tex
+++ b/kernel.tex
@@ -502,48 +502,62 @@ ili {\eng USB} flesh sa kojih se kasnije dizhe sistem.
{\eng as/boot.s}:\\
U prvom delu postavljamo promenljive na vrednosti koje su odredjene {\eng Multiboot2} standardom.\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot00.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo1}\srb\end{minipage}
Nakon toga postavljamo prvih 512 bitova na prethodno pomenute vrednosti ali
tako da za svaku promenljivu ostavljamo 32 bita prostora.\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot01.s}\srb\end{minipage}
-Definisemo sekciju {\eng bss} u kojoj kreiramo stek i dodeljujem mu 16 kilobajta.\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot02.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo2}\srb\end{minipage}
+Definishemo sekciju {\eng bss} u kojoj kreiramo stek i dodeljujem mu 16 kilobajta.\\
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo3}\srb\end{minipage}
I na kraju postavljamo registar esp na vrh steka i pozivamo {\eng kernel\_main}
funkciju koja je napisana u {\eng C}-u.\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/boot03.s}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo10}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo11}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=Assembler]{include/01.pocetak/deo12}\srb\end{minipage}
\section{Ispis na ekran - {\eng VGA}}
\medskip
{\eng c/vga.c}:\\
-Primetimo da u {\eng C}-u koristimo {\eng uintX_t} promenljive. To je zbog toga
-shto nam je sada vrlo bitno da pazimo na velichinu koju zauzimaju promenljive.
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga00.c}\srb\end{minipage}
-Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga05.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga06.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga07.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga08.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga09.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga10.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/vga11.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo1}\srb\end{minipage}
+Primetimo da u {\eng C}-u koristimo {\eng uintX\_t} promenljive. To je zbog toga
+shto nam je sada vrlo bitno da pazimo na velichinu koju zauzimaju promenljive.\\
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo2}\srb\end{minipage}
+4 znachajnija bita oznachavaju boju pozadine, dok ostala 4 bita oznachavaju boju karaktera.\\
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo3}\srb\end{minipage}
+Na {\eng VGA} pisemo tako shto\\
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo10}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo11}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo12}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo13}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/02.vga/deo14}\srb\end{minipage}
\section{{\eng Global Desctiptor Table}}
\medskip
{\eng c/gdt.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/gdt05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/03.gdt/deo9}\srb\end{minipage}
{\eng\url{https://wiki.osdev.org/GDT}}
@@ -552,13 +566,17 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
{\eng c/idt.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt05.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/idt06.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo10}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo11}\srb\end{minipage}
{\eng\url{https://wiki.osdev.org/IDT}}
@@ -566,8 +584,10 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
\medskip
{\eng c/idt.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt07.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/05.irq/idt08.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo12}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo13}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/04.idt/deo14}\srb\end{minipage}
+
{\eng\url{https://wiki.osdev.org/IRQ}}
{\eng\url{https://wiki.osdev.org/PIC}}
@@ -577,29 +597,42 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
{\eng c/keyboard.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard05.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard06.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard07.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard08.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard09.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard10.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard11.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/keyboard12.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo10}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo11}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo12}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo13}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo14}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo15}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo16}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo17}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo18}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo19}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/06.keyboard/deo20}\srb\end{minipage}
\section{{\eng PIT - Programmable Interval Timer}}
\medskip
{\eng c/timer.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/pit03.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/07.pit/deo10}\srb\end{minipage}
{\eng\url{https://wiki.osdev.org/PIT}}
\section{{\eng Heap}}
@@ -607,16 +640,37 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
{\eng c/heap.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap05.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap06.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap07.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap08.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/heap09.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo9}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo10}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo11}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo12}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo13}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo14}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo15}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo16}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo17}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo18}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo19}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo20}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo21}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo22}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo23}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo24}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo25}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo26}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo27}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo28}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo29}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo30}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/08.heap/deo31}\srb\end{minipage}
{\eng\url{https://wiki.osdev.org/Heap}}
\section{{\eng Paging}}
@@ -624,12 +678,15 @@ Prvih 4 bita oznacavaju boju pozadine, a poslednjih 4 bita boju
{\eng c/paging.c}:\\
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging00.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging01.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging02.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging03.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging04.c}\srb\end{minipage}
-\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/paging05.c}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo1}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo2}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo3}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo4}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo5}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo6}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo7}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo8}\srb\end{minipage}
+\begin{minipage}{\textwidth}\eng\lstinputlisting[language=C]{include/09.paging/deo9}\srb\end{minipage}
{\eng\url{https://wiki.osdev.org/Paging}}
@@ -693,5 +750,4 @@ dizajn.
\nocite{*}
\printbibliography[heading=bibintoc,title={Literatura}]
-
\end{document}