summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-08-27 03:20:16 +0200
committerMichal Idziorek <m.i@gmx.at>2014-08-27 03:20:16 +0200
commit50c7bdbe826b5b425748a11273d14e3aed2ce851 (patch)
tree8fc2bec5576aad366b6f9f3f1fcc406f6a3eeb33 /kernel
parentfc7022286a14e7325907fb4e77aa44330037229b (diff)
many changes and adaptions and VESA mode !!
Diffstat (limited to 'kernel')
-rw-r--r--kernel/console.c6
-rw-r--r--kernel/font.h0
-rw-r--r--kernel/kernel.c26
-rw-r--r--kernel/mem.c14
-rw-r--r--kernel/vesa.c111
-rw-r--r--kernel/x86.h11
6 files changed, 157 insertions, 11 deletions
diff --git a/kernel/console.c b/kernel/console.c
index 42dc5d0..b1a9125 100644
--- a/kernel/console.c
+++ b/kernel/console.c
@@ -1,5 +1,7 @@
#include "console.h"
+#define FOOLOS_CONSOLE
+
static int posx=0;
static int posy=0;
@@ -7,9 +9,11 @@ static int posy=0;
void print_char_col(int x, int y, char c, char col)
{
+#ifdef FOOLOS_CONSOLE
char* video_mem=(char *)SCR_VIDEOMEM+(x+y*SCR_REAL_WIDTH)*2;
video_mem[0]=c;
video_mem[1]=col;
+#endif
}
void print_char(int x, int y, char c)
@@ -67,6 +71,7 @@ void scr_put_string_nl(char *str)
void scr_nextline()
{
+#ifdef FOOLOS_CONSOLE
int i,x;
posx=0;
@@ -95,6 +100,7 @@ void scr_nextline()
posy--;
}
+#endif
}
void scr_put_char(char ch,char col)
diff --git a/kernel/font.h b/kernel/font.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kernel/font.h
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 16028fd..f1ba6b7 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -42,7 +42,8 @@ void kernel_main()
//timer_init();
// we know that here the bootloader placed the mamory map!
- mem_init(0x7c00+0x140);
+ mem_init(0x7c00+0x400,*((uint16_t *)(0x7c00+0x600)));
+ //mem_init(0x9000);
// we know that here the bootloader placed the mamory map!
vmem_init();
@@ -78,8 +79,11 @@ void kernel_main()
// pci
pci_init();
+ // vesa init
+ vesa_init(0x8300,0x8400);
+
// floppy
- floppy_init();
+ //floppy_init();
scr_put_string_nl("");
@@ -87,11 +91,27 @@ void kernel_main()
shell_init();
// kernel main loop
+ uint8_t t=0;
+
+// while(1)
+ // {
+ //}
+
+
while(1)
{
-
+ int i;
+ int j;
+ for(i=0;i<1024;i++)
+
+ for(j=0;j<768;j++)
+ {
+ PutPixel(i,j,t);
+ }
+ t+=125;
}
+
}
diff --git a/kernel/mem.c b/kernel/mem.c
index 28e05eb..68880be 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -205,20 +205,27 @@ void mem_test(int start, int end, int steps)
}
*/
-void mem_init(uint16_t *memmap)
+void mem_init(uint16_t *memmap,uint16_t entries)
{
+ scr_put_string("mem: the memory map contains ");
+ scr_put_hex(entries);
+ scr_put_string_nl(" entries.");
+
+ // hardcoded memory bitmap!!??!
_mmngr_memory_map=0x9000;
mem_free_blocks=0;
pmmngr_init ();
// count available memory
uint32_t avail_mem=0;
+ int i;
//print memory map and init regions!
- while(1)
+ for(i=0;i<entries;i++)
{
- if(memmap[8]==0)break;
+
+// if(memmap[8]==0)break;
#ifdef MEM_PRINT_MEMORYMAP
@@ -247,6 +254,7 @@ void mem_init(uint16_t *memmap)
}
memmap+=12;
+
}
scr_put_string("mem: Total Available Mem: ");
diff --git a/kernel/vesa.c b/kernel/vesa.c
new file mode 100644
index 0000000..93a42f3
--- /dev/null
+++ b/kernel/vesa.c
@@ -0,0 +1,111 @@
+//http://wiki.osdev.org/GUI
+#include "kernel.h"
+
+typedef struct vbeinfo_struct{
+ char VbeSignature[4]; // == "VESA"
+ uint16_t VbeVersion; // == 0x0300 for VBE 3.0
+ uint16_t OemStringPtr[2]; // isa vbeFarPtr
+ uint8_t Capabilities[4];
+ uint16_t VideoModePtr[2]; // isa vbeFarPtr
+ uint16_t TotalMemory; // as # of 64KB blocks
+}vbeinfo;
+
+typedef struct ModeInfoBlock {
+ uint16_t attributes;
+ uint8_t winA,winB;
+ uint16_t granularity;
+ uint16_t winsize;
+ uint16_t segmentA, segmentB;
+ uint16_t realFctPtr[2];
+// VBE_FAR(realFctPtr);
+ uint16_t pitch; // bytes per scanline
+
+ uint16_t Xres, Yres;
+ uint8_t Wchar, Ychar, planes, bpp, banks;
+ uint8_t memory_model, bank_size, image_pages;
+ uint8_t reserved0;
+
+ uint8_t red_mask, red_position;
+ uint8_t green_mask, green_position;
+ uint8_t blue_mask, blue_position;
+ uint8_t rsv_mask, rsv_position;
+ uint8_t directcolor_attributes;
+
+ uint32_t physbase; // your LFB (Linear Framebuffer) address ;)
+ uint32_t reserved1;
+ uint16_t reserved2;
+}vbemodeinfo;
+
+static vbemodeinfo *VbeModeInfoBlock;
+
+void vesa_init(vbeinfo *info,vbemodeinfo *mode)
+{
+ int i=0;
+
+// while(info[i].VbeSignature[0]=='V')
+ // {
+ scr_put_string("vesa: init vbe version: ");
+ scr_put_hex(info[i].VbeVersion);
+ scr_put_string(" / videomode ptr: ");
+ scr_put_hex(info[i].VideoModePtr[0]);
+ scr_put_hex(info[i].VideoModePtr[1]);
+ scr_put_string_nl("");
+
+// i++;
+ // }
+ //
+ int *modeptr=info[i].VideoModePtr[0]; // 0x8322; // do not hardcode !!! take from vbeinfo!
+
+ while(*modeptr!=0xffff&&*modeptr!=0)
+ {
+
+ scr_put_string("vesa: mode supported: ");
+ scr_put_hex(*modeptr);
+ scr_put_string_nl("");
+
+ modeptr++;
+ }
+
+ scr_put_string("vesa: selected mode res: ");
+ scr_put_hex(mode->Xres);
+ scr_put_string(" x ");
+ scr_put_hex(mode->Yres);
+ scr_put_string_nl("");
+ scr_put_string("vesa: selected mode banks: ");
+ scr_put_hex(mode->banks);
+ scr_put_string_nl("");
+ scr_put_string("vesa: attribs: ");
+ scr_put_hex(mode->attributes);
+ scr_put_string_nl("");
+ scr_put_string("vesa: physbase: ");
+ scr_put_hex32(mode->physbase);
+ scr_put_string_nl("");
+ scr_put_string("vesa: bpp: ");
+ scr_put_hex(mode->bpp);
+ scr_put_string_nl("");
+/*
+uint8_t *videomem=mode->physbase;
+for(i=0;i<0xffffff;i++)
+{
+ videomem[i]=i;
+}
+*/
+
+ VbeModeInfoBlock=mode;
+
+
+}
+
+void PutPixel(int x,int y, int color){
+
+ //do not write memory outside the screen buffer, check parameters against the VBE mode info
+ if (x<0 || x>VbeModeInfoBlock->Xres|| y<0 || y>VbeModeInfoBlock->Yres) return;
+//
+ if (x) x = (x*(VbeModeInfoBlock->bpp>>3)); // get bytes (divide by 8)
+ if (y) y = (y*VbeModeInfoBlock->pitch);
+ uint8_t *cTemp=VbeModeInfoBlock->physbase;
+ cTemp[x+y] = (uint8_t)(color & 0xff);
+ cTemp[x+y+1] = (uint8_t)((color>>8) & 0xff);
+ cTemp[x+y+2] = (uint8_t)((color>>16) & 0xff);
+ }
+
diff --git a/kernel/x86.h b/kernel/x86.h
index 1e80405..2b7572c 100644
--- a/kernel/x86.h
+++ b/kernel/x86.h
@@ -3,12 +3,13 @@
#include "kernel.h"
-#define X86_IRQ_BEGIN asm("cli\npusha");
-#define X86_IRQ_END asm("mov $0x20, %al\nout %al, $0x20\npopa\nsti\nleave\niret");
-//#define X86_IRQ_BEGIN asm("pusha");
-//#define X86_IRQ_END asm("mov $0x20, %al\nout %al, $0x20\npopa\nleave\niret");
-//
+// todo: cli/sti??
+// http://wiki.osdev.org/Interrupt_Service_Routines
+// Black Magic: Strongly Discouraged!
+#define X86_IRQ_BEGIN asm("\npusha");
+#define X86_IRQ_END asm("mov $0x20, %al\nout %al, $0x20\npopa\nleave\niret");
+
void x86_outb(int port, uint8_t data);
uint8_t x86_inb(int port);
void x86_outw(int port, uint16_t data);