diff options
author | Alexis211 <alexis211@gmail.com> | 2009-08-21 23:59:19 +0200 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-08-21 23:59:19 +0200 |
commit | 74e721676ddd5d996ccf2e1d35da57320f658609 (patch) | |
tree | b39d766c8e27a654c89c2435131e5eaf193125d8 /Source | |
parent | ae803baa4e0ec584c7afd3f6d55f2e6b32010b46 (diff) | |
download | Melon-74e721676ddd5d996ccf2e1d35da57320f658609.tar.gz Melon-74e721676ddd5d996ccf2e1d35da57320f658609.zip |
Kernel now loads in higher half, and uses a VT for output.
Diffstat (limited to 'Source')
25 files changed, 501 insertions, 106 deletions
diff --git a/Source/Kernel/Core/.kmain.wtf.cpp.swp b/Source/Kernel/Core/.kmain.wtf.cpp.swp Binary files differindex bc7a8c6..bf1668b 100644 --- a/Source/Kernel/Core/.kmain.wtf.cpp.swp +++ b/Source/Kernel/Core/.kmain.wtf.cpp.swp diff --git a/Source/Kernel/Core/CMem.ns.o b/Source/Kernel/Core/CMem.ns.o Binary files differdeleted file mode 100644 index b8b6dbb..0000000 --- a/Source/Kernel/Core/CMem.ns.o +++ /dev/null diff --git a/Source/Kernel/Core/Sys.ns.cpp b/Source/Kernel/Core/Sys.ns.cpp index eca826f..361dda6 100644 --- a/Source/Kernel/Core/Sys.ns.cpp +++ b/Source/Kernel/Core/Sys.ns.cpp @@ -1,5 +1,8 @@ //This automatically includes Sys.ns.h #include <Core/common.wtf.h> +#include <VTManager/VirtualTerminal.class.h> + +#define DEBUGVT(x) VirtualTerminal *x = new VirtualTerminal(5, 46, 0, 15); x->map(); x->put('\n'); using namespace CMem; @@ -43,20 +46,24 @@ void bochs_output(char *message, char *file, u32int line) { void panic(char *message, char *file, u32int line) { asm volatile("cli"); - bochs_output("PANIC : ", file, 0); + DEBUGVT(vt); + bochs_output("PANIC : ", file, line); bochs_output(message, file, 0); + *vt << " PANIC : " << message << "\n In " << file << ":" << (s32int)line << "\n"; - while (1); //Enter infinite loop for halt + while (1) asm volatile("hlt"); //Enter infinite loop for halt } //Used by ASSERT() macro (see common.wtf.h) void panic_assert(char *file, u32int line, char *desc) { asm volatile("cli"); - bochs_output("ASSERTION FAILED : ", file, 0); + DEBUGVT(vt); + bochs_output("ASSERTION FAILED : ", file, line); bochs_output(desc, file, 0); + *vt << " ASSERTION FAILED : " << desc << "\n In " << file << ":" << (s32int)line << "\n"; - while (1); //Enter infinite loop for halt + while (1) asm volatile("hlt"); //Enter infinite loop for halt } void reboot() { diff --git a/Source/Kernel/Core/Sys.ns.o b/Source/Kernel/Core/Sys.ns.o Binary files differdeleted file mode 100644 index 58f3dc8..0000000 --- a/Source/Kernel/Core/Sys.ns.o +++ /dev/null diff --git a/Source/Kernel/Core/common.wtf.h b/Source/Kernel/Core/common.wtf.h index 9b1bc7e..617a73c 100644 --- a/Source/Kernel/Core/common.wtf.h +++ b/Source/Kernel/Core/common.wtf.h @@ -24,4 +24,17 @@ typedef char s8int; #define DEBUG(m) #endif +#include <MemoryManager/Mem.ns.h> + +//Standard implemenations of operator new/delete +inline void* operator new(u32int, void *p) { return p; } +inline void* operator new[](u32int, void *p) { return p; } +inline void operator delete(void*, void*) { } +inline void operator delete[](void*, void*) { } + +inline void* operator new(u32int sz) { return Mem::kalloc(sz); } +inline void* operator new[](u32int sz) { return Mem::kalloc(sz); } +inline void operator delete(void *ptr) { Mem::kfree(ptr); } +inline void operator delete[](void *ptr) { Mem::kfree(ptr); } + #endif diff --git a/Source/Kernel/Core/cppsupport.wtf.o b/Source/Kernel/Core/cppsupport.wtf.o Binary files differdeleted file mode 100644 index 4088bfb..0000000 --- a/Source/Kernel/Core/cppsupport.wtf.o +++ /dev/null diff --git a/Source/Kernel/Core/kmain.wtf.cpp b/Source/Kernel/Core/kmain.wtf.cpp index 59fa45a..e201a07 100644 --- a/Source/Kernel/Core/kmain.wtf.cpp +++ b/Source/Kernel/Core/kmain.wtf.cpp @@ -3,6 +3,7 @@ #include <Devices/Display/VGATextOutput.class.h> #include <DisplayManager/Disp.ns.h> +#include <VTManager/VirtualTerminal.class.h> #include <Ressources/logo.cd> @@ -13,9 +14,11 @@ extern "C" void kmain(multiboot_info_t* mbd, u32int magic); void kmain(multiboot_info_t* mbd, u32int magic) { DEBUG("Entering kmain."); - VGATextOutput vgaout; + Mem::placementAddress = (u32int)&end; - Disp::setDisplay(&vgaout); + VGATextOutput *vgaout = new VGATextOutput(); + + Disp::setDisplay(vgaout); for (int i = 0; i < melonLogoLines; i++) { int startCol = (Disp::textCols() / 2) - (melonLogoCols / 2); @@ -24,6 +27,13 @@ void kmain(multiboot_info_t* mbd, u32int magic) { } } + VirtualTerminal *kvt = new VirtualTerminal(12, 40, 0, 2); + kvt->map(melonLogoLines + 4); + + *kvt << "Kernel initializing in HIGHER HALF!\n"; + + *kvt << "Lower ram : " << (s32int)mbd->mem_lower << "k, upper : " << (s32int)mbd->mem_upper << "k.\n"; + if (magic != MULTIBOOT_BOOTLOADER_MAGIC) { PANIC("Error with multiboot header."); } diff --git a/Source/Kernel/Core/kmain.wtf.o b/Source/Kernel/Core/kmain.wtf.o Binary files differdeleted file mode 100644 index 19a82cf..0000000 --- a/Source/Kernel/Core/kmain.wtf.o +++ /dev/null diff --git a/Source/Kernel/Core/loader.wtf.asm b/Source/Kernel/Core/loader.wtf.asm index e5f5839..c5248e9 100644 --- a/Source/Kernel/Core/loader.wtf.asm +++ b/Source/Kernel/Core/loader.wtf.asm @@ -21,8 +21,21 @@ STACKSIZE equ 0x4000 ; that's 16k. extern start_ctors, end_ctors, start_dtors, end_dtors loader: + lgdt [trickgdt] + mov cx, 0x10; + mov ds, cx; + mov es, cx; + mov fs, cx; + mov gs, cx; + mov ss, cx; + + jmp 0x08:higherhalf + + +higherhalf: mov esp, stack+STACKSIZE ; set up the stack push eax ; pass Multiboot magic number + add ebx, 0xC0000000 ; update the MB info structure so that it is in the new seg. push ebx ; pass Multiboot info structure static_ctors_loop: @@ -52,8 +65,21 @@ static_dtors_loop: ; useless, kernel should never return hang: hlt ; halt machine should kernel return jmp hang + +[section .setup] + +trickgdt: + dw gdt_end - gdt - 1 + dd gdt + +gdt: + dd 0, 0 + db 0xFF, 0xFF, 0, 0, 0, 10011010b, 11001111b, 0x40 + db 0xFF, 0xFF, 0, 0, 0, 10010010b, 11001111b, 0x40 + +gdt_end: -section .bss +[section .bss] align 32 stack: resb STACKSIZE ; reserve 16k stack on a quadword boundary diff --git a/Source/Kernel/Core/loader.wtf.o b/Source/Kernel/Core/loader.wtf.o Binary files differdeleted file mode 100644 index caed8f0..0000000 --- a/Source/Kernel/Core/loader.wtf.o +++ /dev/null diff --git a/Source/Kernel/Devices/Display/Display.proto.h b/Source/Kernel/Devices/Display/Display.proto.h index 8e8e29d..d91023a 100644 --- a/Source/Kernel/Devices/Display/Display.proto.h +++ b/Source/Kernel/Devices/Display/Display.proto.h @@ -7,7 +7,7 @@ class Display { public: virtual u16int textCols() = 0; virtual u16int textRows() = 0; - virtual void putChar(u16int line, u16int col, char c, char color) = 0; //Color : <bg 4byte><fg 4byte> + virtual void putChar(u16int line, u16int col, char c, u8int color) = 0; //Color : <bg 4byte><fg 4byte> virtual void moveCursor(u16int line, u16int col) = 0; virtual void clear() = 0; }; diff --git a/Source/Kernel/Devices/Display/VGATextOutput.class.cpp b/Source/Kernel/Devices/Display/VGATextOutput.class.cpp index 66bffd5..28c943a 100644 --- a/Source/Kernel/Devices/Display/VGATextOutput.class.cpp +++ b/Source/Kernel/Devices/Display/VGATextOutput.class.cpp @@ -1,5 +1,7 @@ #include "VGATextOutput.class.h" +#define RAM_ADDR 0xC00B8000 + using namespace Sys; //For outb u16int VGATextOutput::textCols() { @@ -10,8 +12,8 @@ u16int VGATextOutput::textRows() { return 25; } -void VGATextOutput::putChar(u16int line, u16int col, char c, char color) { - u16int* where = (u16int*)0xB8000; +void VGATextOutput::putChar(u16int line, u16int col, char c, u8int color) { + u16int* where = (u16int*)RAM_ADDR; where[(80 * line) + col] = (color << 8) | c; } @@ -24,6 +26,6 @@ void VGATextOutput::moveCursor(u16int line, u16int col) { } void VGATextOutput::clear() { - u16int* where = (u16int*)0xB8000; + u16int* where = (u16int*)RAM_ADDR; for (int i = 0; i < 25 * 80; i++) where[i] = 0; } diff --git a/Source/Kernel/Devices/Display/VGATextOutput.class.h b/Source/Kernel/Devices/Display/VGATextOutput.class.h index 72ad604..a7968c7 100644 --- a/Source/Kernel/Devices/Display/VGATextOutput.class.h +++ b/Source/Kernel/Devices/Display/VGATextOutput.class.h @@ -7,7 +7,7 @@ class VGATextOutput : public Display { public: u16int textCols(); u16int textRows(); - void putChar(u16int line, u16int col, char c, char color); + void putChar(u16int line, u16int col, char c, u8int color); void moveCursor(u16int line, u16int col); void clear(); }; diff --git a/Source/Kernel/Devices/Display/VGATextOutput.class.o b/Source/Kernel/Devices/Display/VGATextOutput.class.o Binary files differdeleted file mode 100644 index ccd63a1..0000000 --- a/Source/Kernel/Devices/Display/VGATextOutput.class.o +++ /dev/null diff --git a/Source/Kernel/DisplayManager/Disp.ns.cpp b/Source/Kernel/DisplayManager/Disp.ns.cpp index 75344f8..8db9503 100644 --- a/Source/Kernel/DisplayManager/Disp.ns.cpp +++ b/Source/Kernel/DisplayManager/Disp.ns.cpp @@ -12,7 +12,7 @@ u16int textRows() { return mode.textRows; } -void putChar(u16int line, u16int col, char c, char color) { +void putChar(u16int line, u16int col, char c, u8int color) { if (line >= mode.textRows or col >= mode.textCols) return; mode.device->putChar(line, col, c, color); } diff --git a/Source/Kernel/DisplayManager/Disp.ns.h b/Source/Kernel/DisplayManager/Disp.ns.h index 76c9f60..a815836 100644 --- a/Source/Kernel/DisplayManager/Disp.ns.h +++ b/Source/Kernel/DisplayManager/Disp.ns.h @@ -11,7 +11,7 @@ namespace Disp { u16int textCols(); u16int textRows(); - void putChar(u16int line, u16int col, char c, char color); + void putChar(u16int line, u16int col, char c, u8int color); void moveCursor(u16int line, u16int col); void clear(); diff --git a/Source/Kernel/DisplayManager/Disp.ns.o b/Source/Kernel/DisplayManager/Disp.ns.o Binary files differdeleted file mode 100644 index 1ac31fd..0000000 --- a/Source/Kernel/DisplayManager/Disp.ns.o +++ /dev/null diff --git a/Source/Kernel/Link.ld b/Source/Kernel/Link.ld index bcd0b90..dd6add0 100644 --- a/Source/Kernel/Link.ld +++ b/Source/Kernel/Link.ld @@ -3,15 +3,21 @@ ENTRY (loader) SECTIONS{ . = 0x00100000; - .text :{ + .setup : { + *(.setup) + } + + . += 0xC0000000; + + .text : AT(ADDR(.text) - 0xC0000000) { *(.text) } - .rodata ALIGN (0x1000) : { + .rodata ALIGN (0x1000) : AT(ADDR(.rodata) - 0xC0000000) { *(.rodata) } - .data ALIGN (0x1000) : { + .data ALIGN (0x1000) : AT(ADDR(.data) - 0xC0000000) { start_ctors = .; *(.ctor*) end_ctors = .; @@ -21,7 +27,7 @@ SECTIONS{ *(.data) } - .bss : { + .bss : AT(ADDR(.bss) - 0xC0000000) { sbss = .; *(COMMON) *(.bss) diff --git a/Source/Kernel/Makefile b/Source/Kernel/Makefile index 3cc45cc..e42e881 100644 --- a/Source/Kernel/Makefile +++ b/Source/Kernel/Makefile @@ -15,7 +15,9 @@ Objects = Core/kmain.wtf.o \ Core/cppsupport.wtf.o \ Core/Sys.ns.o \ Core/CMem.ns.o \ + MemoryManager/Mem.ns.o \ DisplayManager/Disp.ns.o \ + VTManager/VirtualTerminal.class.o \ Devices/Display/VGATextOutput.class.o all: $(OutFile) diff --git a/Source/Kernel/Map.txt b/Source/Kernel/Map.txt index 9049ad0..fec07b3 100644 --- a/Source/Kernel/Map.txt +++ b/Source/Kernel/Map.txt @@ -4,6 +4,18 @@ Discarded input sections .group 0x00000000 0x0 Core/kmain.wtf.o .group 0x00000000 0x0 Core/kmain.wtf.o .group 0x00000000 0x0 Core/kmain.wtf.o + .group 0x00000000 0x0 Core/kmain.wtf.o + .group 0x00000000 0x0 Core/kmain.wtf.o + .group 0x00000000 0x0 Core/kmain.wtf.o + .group 0x00000000 0x0 Core/Sys.ns.o + .group 0x00000000 0x0 Core/Sys.ns.o + .group 0x00000000 0x0 Core/Sys.ns.o + .text._Znwj 0x00000000 0x0 Core/Sys.ns.o + .text._ZN15VirtualTerminallsEPc + 0x00000000 0x0 Core/Sys.ns.o + .text._ZN15VirtualTerminallsEi + 0x00000000 0x0 Core/Sys.ns.o + .group 0x00000000 0x0 VTManager/VirtualTerminal.class.o .group 0x00000000 0x0 Devices/Display/VGATextOutput.class.o Memory Configuration @@ -15,78 +27,132 @@ Linker script and memory map 0x00100000 . = 0x100000 -.text 0x00100000 0x6cf +.setup 0x00100000 0x1e + *(.setup) + .setup 0x00100000 0x1e Core/loader.wtf.o + 0xc010001e . = (. + 0xc0000000) + +.text 0xc0100020 0x1277 load address 0x00100020 *(.text) - .text 0x00100000 0x106 Core/kmain.wtf.o - 0x00100000 kmain - *fill* 0x00100106 0xa 00 - .text 0x00100110 0x53 Core/loader.wtf.o - 0x0010011c loader - *fill* 0x00100163 0x1 00 - .text 0x00100164 0xf Core/cppsupport.wtf.o - 0x00100164 __cxa_pure_virtual - 0x00100169 __cxa_atexit - *fill* 0x00100173 0x1 00 - .text 0x00100174 0x1ec Core/Sys.ns.o - 0x001001ce Sys::bochs_output(char*, char*, unsigned int) - 0x00100192 Sys::inb(unsigned short) - 0x001001af Sys::inw(unsigned short) - 0x001002c8 Sys::panic(char*, char*, unsigned int) - 0x00100344 Sys::reboot() - 0x00100174 Sys::outb(unsigned short, unsigned char) - 0x00100306 Sys::panic_assert(char*, unsigned int, char*) - .text 0x00100360 0xd5 Core/CMem.ns.o - 0x00100396 CMem::memset(unsigned char*, unsigned char, int) - 0x001003cd CMem::memsetw(unsigned short*, unsigned short, int) - 0x00100408 CMem::strlen(char const*) - 0x00100360 CMem::memcpy(unsigned char*, unsigned char const*, int) - *fill* 0x00100435 0x3 00 - .text 0x00100438 0x167 DisplayManager/Disp.ns.o - 0x0010044c Disp::putChar(unsigned short, unsigned short, char, char) - 0x00100442 Disp::textRows() - 0x0010052e Disp::clear() - 0x00100438 Disp::textCols() - 0x0010054c Disp::setDisplay(Display*) - 0x001004cd Disp::moveCursor(unsigned short, unsigned short) - *fill* 0x0010059f 0x1 00 - .text 0x001005a0 0x12f Devices/Display/VGATextOutput.class.o - 0x001005a0 VGATextOutput::textCols() - 0x00100698 VGATextOutput::clear() - 0x00100612 VGATextOutput::moveCursor(unsigned short, unsigned short) - 0x001005aa VGATextOutput::textRows() - 0x001005b4 VGATextOutput::putChar(unsigned short, unsigned short, char, char) + .text 0xc0100020 0x1f0 Core/kmain.wtf.o + 0xc0100020 kmain + .text 0xc0100210 0x75 Core/loader.wtf.o + 0xc010021c loader + *fill* 0xc0100285 0x3 00 + .text 0xc0100288 0xf Core/cppsupport.wtf.o + 0xc0100288 __cxa_pure_virtual + 0xc010028d __cxa_atexit + *fill* 0xc0100297 0x1 00 + .text 0xc0100298 0x3b0 Core/Sys.ns.o + 0xc01002f2 Sys::bochs_output(char*, char*, unsigned int) + 0xc01002b6 Sys::inb(unsigned short) + 0xc01002d3 Sys::inw(unsigned short) + 0xc01003ec Sys::panic(char*, char*, unsigned int) + 0xc010062c Sys::reboot() + 0xc0100298 Sys::outb(unsigned short, unsigned char) + 0xc010050c Sys::panic_assert(char*, unsigned int, char*) + .text 0xc0100648 0xd5 Core/CMem.ns.o + 0xc010067e CMem::memset(unsigned char*, unsigned char, int) + 0xc01006b5 CMem::memsetw(unsigned short*, unsigned short, int) + 0xc01006f0 CMem::strlen(char const*) + 0xc0100648 CMem::memcpy(unsigned char*, unsigned char const*, int) + *fill* 0xc010071d 0x3 00 + .text 0xc0100720 0x8e MemoryManager/Mem.ns.o + 0xc0100778 Mem::kalloc(unsigned int, bool) + 0xc0100720 Mem::kallocInternal(unsigned int, bool) + *fill* 0xc01007ae 0x2 00 + .text 0xc01007b0 0x167 DisplayManager/Disp.ns.o + 0xc01007ba Disp::textRows() + 0xc01008a6 Disp::clear() + 0xc01007b0 Disp::textCols() + 0xc01008c4 Disp::setDisplay(Display*) + 0xc0100845 Disp::moveCursor(unsigned short, unsigned short) + 0xc01007c4 Disp::putChar(unsigned short, unsigned short, char, unsigned char) + *fill* 0xc0100917 0x1 00 + .text 0xc0100918 0x84d VTManager/VirtualTerminal.class.o + 0xc0100b7e VirtualTerminal::map(int, int) + 0xc0100bec VirtualTerminal::unmap() + 0xc0100e26 VirtualTerminal::put(char, bool) + 0xc0100dee VirtualTerminal::setCursorLine(unsigned int) + 0xc0100a18 VirtualTerminal::setColor(unsigned char, unsigned char) + 0xc0100e0a VirtualTerminal::setCursorCol(unsigned int) + 0xc0100998 VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char) + 0xc0100d8c VirtualTerminal::updateCursor() + 0xc0100f74 VirtualTerminal::write(char*, bool) + 0xc0100fc8 VirtualTerminal::writeDec(int, bool) + 0xc0100bf8 VirtualTerminal::redraw() + 0xc0100a66 VirtualTerminal::putChar(unsigned int, unsigned int, char) + 0xc01010ca VirtualTerminal::writeHex(unsigned int, bool) + 0xc0100cd2 VirtualTerminal::scroll() + 0xc0100918 VirtualTerminal::VirtualTerminal(unsigned int, unsigned int, unsigned char, unsigned char) + 0xc0100b14 VirtualTerminal::clear() + 0xc0100dc8 VirtualTerminal::moveCursor(unsigned int, unsigned int) + *fill* 0xc0101165 0x3 00 + .text 0xc0101168 0x12f Devices/Display/VGATextOutput.class.o + 0xc0101168 VGATextOutput::textCols() + 0xc0101260 VGATextOutput::clear() + 0xc01011da VGATextOutput::moveCursor(unsigned short, unsigned short) + 0xc010117c VGATextOutput::putChar(unsigned short, unsigned short, char, unsigned char) + 0xc0101172 VGATextOutput::textRows() + +.text._Znwj 0xc0101297 0x1b load address 0x00101297 + .text._Znwj 0xc0101297 0x1b Core/kmain.wtf.o + 0xc0101297 operator new(unsigned int) + +.text._ZN15VirtualTerminallsEPc + 0xc01012b2 0x25 load address 0x001012b2 + .text._ZN15VirtualTerminallsEPc + 0xc01012b2 0x25 Core/kmain.wtf.o + 0xc01012b2 VirtualTerminal::operator<<(char*) + +.text._ZN15VirtualTerminallsEi + 0xc01012d8 0x25 load address 0x001012d8 + .text._ZN15VirtualTerminallsEi + 0xc01012d8 0x25 Core/kmain.wtf.o + 0xc01012d8 VirtualTerminal::operator<<(int) .text._ZN7DisplayC2Ev - 0x001006d0 0xe + 0xc01012fe 0xe load address 0x001012fe .text._ZN7DisplayC2Ev - 0x001006d0 0xe Core/kmain.wtf.o - 0x001006d0 Display::Display() + 0xc01012fe 0xe Core/kmain.wtf.o + 0xc01012fe Display::Display() .text._ZN13VGATextOutputC1Ev - 0x001006de 0x1c + 0xc010130c 0x1c load address 0x0010130c .text._ZN13VGATextOutputC1Ev - 0x001006de 0x1c Core/kmain.wtf.o - 0x001006de VGATextOutput::VGATextOutput() + 0xc010130c 0x1c Core/kmain.wtf.o + 0xc010130c VGATextOutput::VGATextOutput() -.rodata 0x00101000 0x220 +.text._Znaj 0xc0101328 0x1b load address 0x00101328 + .text._Znaj 0xc0101328 0x1b VTManager/VirtualTerminal.class.o + 0xc0101328 operator new[](unsigned int) + +.rodata 0xc0102000 0x293 load address 0x00102000 *(.rodata) - .rodata 0x00101000 0x1fd Core/kmain.wtf.o - .rodata 0x001011fd 0x23 Core/Sys.ns.o + .rodata 0xc0102000 0x23f Core/kmain.wtf.o + .rodata 0xc010223f 0x51 Core/Sys.ns.o + .rodata 0xc0102290 0x3 VTManager/VirtualTerminal.class.o .rodata._ZTV7Display - 0x00101220 0x1c + 0xc0102298 0x1c load address 0x00102298 .rodata._ZTV7Display - 0x00101220 0x1c Core/kmain.wtf.o - 0x00101220 vtable for Display + 0xc0102298 0x1c Core/kmain.wtf.o + 0xc0102298 vtable for Display .rodata._ZTV13VGATextOutput - 0x00101240 0x1c + 0xc01022b8 0x1c load address 0x001022b8 .rodata._ZTV13VGATextOutput - 0x00101240 0x1c Devices/Display/VGATextOutput.class.o - 0x00101240 vtable for VGATextOutput + 0xc01022b8 0x1c Devices/Display/VGATextOutput.class.o + 0xc01022b8 vtable for VGATextOutput -.rel.dyn 0x0010125c 0x0 +.rel.dyn 0xc01022d4 0x0 load address 0x001022d4 .rel.text 0x00000000 0x0 Core/kmain.wtf.o + .rel.text._Znwj + 0x00000000 0x0 Core/kmain.wtf.o + .rel.text._ZN15VirtualTerminallsEPc + 0x00000000 0x0 Core/kmain.wtf.o + .rel.text._ZN15VirtualTerminallsEi + 0x00000000 0x0 Core/kmain.wtf.o .rel.text._ZN7DisplayC2Ev 0x00000000 0x0 Core/kmain.wtf.o .rel.text._ZN13VGATextOutputC1Ev @@ -94,58 +160,69 @@ Linker script and memory map .rel.rodata._ZTV7Display 0x00000000 0x0 Core/kmain.wtf.o -.data 0x00102000 0x24 - 0x00102000 start_ctors = . +.data 0xc0103000 0x24 load address 0x00103000 + 0xc0103000 start_ctors = . *(.ctor*) - 0x00102000 end_ctors = . - 0x00102000 start_dtors = . + 0xc0103000 end_ctors = . + 0xc0103000 start_dtors = . *(.dtor*) - 0x00102000 end_dtors = . + 0xc0103000 end_dtors = . *(.data) - .data 0x00102000 0x24 Core/kmain.wtf.o - 0x00102020 melonLogoCols - 0x00102000 melonLogo - 0x0010201c melonLogoLines - .data 0x00102024 0x0 Core/cppsupport.wtf.o - .data 0x00102024 0x0 Core/Sys.ns.o - .data 0x00102024 0x0 Core/CMem.ns.o - .data 0x00102024 0x0 DisplayManager/Disp.ns.o - .data 0x00102024 0x0 Devices/Display/VGATextOutput.class.o - -.bss 0x00102024 0x4010 - 0x00102024 sbss = . + .data 0xc0103000 0x24 Core/kmain.wtf.o + 0xc0103020 melonLogoCols + 0xc0103000 melonLogo + 0xc010301c melonLogoLines + .data 0xc0103024 0x0 Core/cppsupport.wtf.o + .data 0xc0103024 0x0 Core/Sys.ns.o + .data 0xc0103024 0x0 Core/CMem.ns.o + .data 0xc0103024 0x0 MemoryManager/Mem.ns.o + .data 0xc0103024 0x0 DisplayManager/Disp.ns.o + .data 0xc0103024 0x0 VTManager/VirtualTerminal.class.o + .data 0xc0103024 0x0 Devices/Display/VGATextOutput.class.o + +.bss 0xc0103024 0x401c load address 0x00103024 + 0xc0103024 sbss = . *(COMMON) *(.bss) - .bss 0x00102024 0x0 Core/kmain.wtf.o - .bss 0x00102024 0x4000 Core/loader.wtf.o - .bss 0x00106024 0x4 Core/cppsupport.wtf.o - 0x00106024 __dso_handle - .bss 0x00106028 0x0 Core/Sys.ns.o - .bss 0x00106028 0x0 Core/CMem.ns.o - .bss 0x00106028 0xc DisplayManager/Disp.ns.o - 0x00106028 Disp::mode - .bss 0x00106034 0x0 Devices/Display/VGATextOutput.class.o - 0x00106034 ebss = . - 0x00106034 end = . - 0x00106034 _end = . - 0x00106034 __end = . + .bss 0xc0103024 0x0 Core/kmain.wtf.o + .bss 0xc0103024 0x4000 Core/loader.wtf.o + .bss 0xc0107024 0x4 Core/cppsupport.wtf.o + 0xc0107024 __dso_handle + .bss 0xc0107028 0x0 Core/Sys.ns.o + .bss 0xc0107028 0x0 Core/CMem.ns.o + .bss 0xc0107028 0xc MemoryManager/Mem.ns.o + 0xc0107030 Mem::kheapFree + 0xc0107028 Mem::kheapUsable + 0xc010702c Mem::placementAddress + .bss 0xc0107034 0xc DisplayManager/Disp.ns.o + 0xc0107034 Disp::mode + .bss 0xc0107040 0x0 VTManager/VirtualTerminal.class.o + .bss 0xc0107040 0x0 Devices/Display/VGATextOutput.class.o + 0xc0107040 ebss = . + 0xc0107040 end = . + 0xc0107040 _end = . + 0xc0107040 __end = . LOAD Core/kmain.wtf.o LOAD Core/loader.wtf.o LOAD Core/cppsupport.wtf.o LOAD Core/Sys.ns.o LOAD Core/CMem.ns.o +LOAD MemoryManager/Mem.ns.o LOAD DisplayManager/Disp.ns.o +LOAD VTManager/VirtualTerminal.class.o LOAD Devices/Display/VGATextOutput.class.o OUTPUT(Melon.ke elf32-i386) -.comment 0x00000000 0x8b +.comment 0x00000000 0xaf .comment 0x00000000 0x12 Core/kmain.wtf.o .comment 0x00000012 0x1f Core/loader.wtf.o .comment 0x00000031 0x12 Core/cppsupport.wtf.o .comment 0x00000043 0x12 Core/Sys.ns.o .comment 0x00000055 0x12 Core/CMem.ns.o - .comment 0x00000067 0x12 DisplayManager/Disp.ns.o - .comment 0x00000079 0x12 Devices/Display/VGATextOutput.class.o + .comment 0x00000067 0x12 MemoryManager/Mem.ns.o + .comment 0x00000079 0x12 DisplayManager/Disp.ns.o + .comment 0x0000008b 0x12 VTManager/VirtualTerminal.class.o + .comment 0x0000009d 0x12 Devices/Display/VGATextOutput.class.o .note.GNU-stack 0x00000000 0x0 @@ -158,6 +235,10 @@ OUTPUT(Melon.ke elf32-i386) .note.GNU-stack 0x00000000 0x0 Core/CMem.ns.o .note.GNU-stack + 0x00000000 0x0 MemoryManager/Mem.ns.o + .note.GNU-stack 0x00000000 0x0 DisplayManager/Disp.ns.o .note.GNU-stack + 0x00000000 0x0 VTManager/VirtualTerminal.class.o + .note.GNU-stack 0x00000000 0x0 Devices/Display/VGATextOutput.class.o diff --git a/Source/Kernel/Melon.ke b/Source/Kernel/Melon.ke Binary files differindex b4a7f39..5b40f90 100755 --- a/Source/Kernel/Melon.ke +++ b/Source/Kernel/Melon.ke diff --git a/Source/Kernel/MemoryManager/Mem.ns.cpp b/Source/Kernel/MemoryManager/Mem.ns.cpp new file mode 100644 index 0000000..d8bfc4f --- /dev/null +++ b/Source/Kernel/MemoryManager/Mem.ns.cpp @@ -0,0 +1,23 @@ +#include <Core/common.wtf.h> + +namespace Mem { + +bool kheapUsable = false; +u32int placementAddress, kheapFree; + +void *kallocInternal(u32int sz, bool align) { + if (align && (placementAddress & 0xFFFFF000)) { + placementAddress &= 0xFFFFF000; + placementAddress += 0x1000; + } + u32int temp = placementAddress; + placementAddress += sz; + return (void*)temp; +} + +void *kalloc(u32int sz, bool align) { + if (!kheapUsable) return kallocInternal(sz, align); + return 0; +} + +} diff --git a/Source/Kernel/MemoryManager/Mem.ns.h b/Source/Kernel/MemoryManager/Mem.ns.h new file mode 100644 index 0000000..b3177a4 --- /dev/null +++ b/Source/Kernel/MemoryManager/Mem.ns.h @@ -0,0 +1,16 @@ +#ifdef DEF_COMMON + +#ifndef DEF_MEM_NS_H +#define DEF_MEM_NS_H + +namespace Mem { + extern u32int placementAddress, kheapFree; + + void *kalloc(u32int sz, bool align = false); + void kfree(void *ptr); + +} + +#endif + +#endif diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.cpp b/Source/Kernel/VTManager/VirtualTerminal.class.cpp new file mode 100644 index 0000000..6478be4 --- /dev/null +++ b/Source/Kernel/VTManager/VirtualTerminal.class.cpp @@ -0,0 +1,158 @@ +#include "VirtualTerminal.class.h" +#include <DisplayManager/Disp.ns.h> + +#define BUFCHR(l, c) m_buff[(l * m_rows) + c] + +VirtualTerminal::VirtualTerminal(u32int rows, u32int cols, u8int fgcolor, u8int bgcolor) { + m_buff = new chr[rows * cols]; + m_rows = rows; + m_cols = cols; + m_mapped = false; + setColor(fgcolor, bgcolor); + clear(); + + m_csrcol = 0; + m_csrlin = 0; +} + +void VirtualTerminal::setColor(u8int fgcolor, u8int bgcolor) { + if (bgcolor == 0xFF) { + m_color = (m_color & 0xF0) | fgcolor; + } else { + m_color = (bgcolor << 4) | fgcolor; + } +} + +void VirtualTerminal::putChar(u32int row, u32int col, char c) { + chr* ch = &BUFCHR(row, col); + ch->c = c; + ch->color = m_color; + if (m_mapped) + Disp::putChar(row + m_maprow, col + m_mapcol, BUFCHR(row, col).c, m_color); +} + +void VirtualTerminal::clear() { + for (u32int i = 0; i < m_rows * m_cols; i++) { + m_buff[i].c = ' '; + m_buff[i].color = m_color; + } + if (m_mapped) redraw(); +} + +void VirtualTerminal::map(s32int row, s32int col) { + m_maprow = (row == -1 ? (Disp::textRows() / 2) - (m_rows / 2) : row); + m_mapcol = (col == -1 ? (Disp::textCols() / 2) - (m_cols / 2) : col); + m_mapped = true; + redraw(); +} + +void VirtualTerminal::unmap() { + m_mapped = false; +} + +void VirtualTerminal::redraw() { + if (!m_mapped) return; + for (u32int r = 0; r < m_rows; r++) { + for (u32int c = 0; c < m_cols; c++) { + Disp::putChar(r + m_maprow, c + m_mapcol, BUFCHR(r, c).c, BUFCHR(r, c).color); + } + } +} + +void VirtualTerminal::scroll() { + for (u32int l = 0; l < m_rows - 1; l++) { + for (u32int c = 0; c < m_cols; c++) { + BUFCHR(l, c) = BUFCHR(l + 1, c); + } + } + for (u32int c = 0; c < m_cols; c++) { + BUFCHR(m_rows - 1, c).c = ' '; + BUFCHR(m_rows - 1, c).color = m_color; + } +} + +void VirtualTerminal::updateCursor() { + Disp::moveCursor(m_csrlin + m_maprow, m_csrcol + m_mapcol); +} + +void VirtualTerminal::moveCursor(u32int row, u32int col) { + m_csrlin = row; + m_csrcol = col; + updateCursor(); +} + +void VirtualTerminal::setCursorLine(u32int line) { + m_csrlin = line; + updateCursor(); +} + +void VirtualTerminal::setCursorCol(u32int col) { + m_csrcol = col; + updateCursor(); +} + + +// Display functionn +void VirtualTerminal::put(char c, bool updatecsr) { + if (c == 0x08) { //Ascii backspace + if (m_csrcol > 0) m_csrcol--; + putChar(m_csrlin, m_csrcol, ' '); + } else if (c == 0x09) { //Ascii tab + m_csrcol = (m_csrcol + 8) &~(8 - 1); + } else if (c == '\r') { + m_csrcol = 0; + } else if (c == '\n') { + m_csrcol = 0; + m_csrlin++; + } else if (c >= ' ') { //Printable character + putChar(m_csrlin, m_csrcol, c); + m_csrcol++; + } + if (m_csrcol >= m_cols) { + m_csrcol = 0; + m_csrlin++; + } + if (m_csrlin >= m_rows) { + scroll(); + m_csrlin--; + } + if (updatecsr) updateCursor(); +} + +void VirtualTerminal::write(char* c, bool updatecsr) { + while (*c) { + put(*(c++), false); + } + if (updatecsr) updateCursor(); +} + +void VirtualTerminal::writeDec(s32int i, bool updatecsr) { + if (i == 0) { + put('0', false); + } else if (i < 0) { + put('-', false); + i = 0 - i; + } + char c[32]; + int n = 0; + while (i > 0) { + c[n] = '0' + (i % 10); + i /= 10; + n++; + } + while (n > 0) { + n--; + put(c[n], false); + } + if (updatecsr) updateCursor(); +} + +void VirtualTerminal::writeHex(u32int i, bool updatecsr) { + write("0x", false); + char hexdigits[] = "0123456789ABCDEF"; + for (u32int j = 0; j < 8; j++) { + put(hexdigits[(i & 0xF0000000) >> 28], false); + i = i << 4; + } + if (updatecsr) updateCursor(); +} diff --git a/Source/Kernel/VTManager/VirtualTerminal.class.h b/Source/Kernel/VTManager/VirtualTerminal.class.h new file mode 100644 index 0000000..801d009 --- /dev/null +++ b/Source/Kernel/VTManager/VirtualTerminal.class.h @@ -0,0 +1,51 @@ +#ifndef DEF_VIRTUALTERMINAL_CLASS_H +#define DEF_VIRTUALTERMINAL_CLASS_H + +#include <Core/common.wtf.h> + +struct chr { + u8int color; + char c; + }; + +class VirtualTerminal { + private: + chr* m_buff; + u32int m_rows, m_cols; + u8int m_color; + + u32int m_maprow, m_mapcol; + bool m_mapped; + + u32int m_csrlin, m_csrcol; + + public: + VirtualTerminal(u32int rows, u32int cols, u8int fgcolor = 7, u8int bgcolor = 0); + + void setColor(u8int fgcolor, u8int bgcolor = 0xFF); + void putChar(u32int row, u32int col, char c); + void clear(); + + void map(s32int row = -1, s32int col = -1); + void unmap(); + void redraw(); + void scroll(); //Scrolls 1 line + + void updateCursor(); + void moveCursor(u32int row, u32int col); + void setCursorLine(u32int line); + void setCursorCol(u32int col); + + //Display functions + void put(char c, bool updatecsr = true); + void write(char *c, bool updatecsr = true); + void writeDec(s32int i, bool updatecsr = true); + void writeHex(u32int i, bool updatecsr = true); + + inline VirtualTerminal& operator<<(char *c) { write(c); return *this; } + inline VirtualTerminal& operator<<(char c) { put(c); return *this; } + inline VirtualTerminal& operator<<(s32int i) { writeDec(i); return *this; } + inline VirtualTerminal& operator<<(u32int i) { writeHex(i); return *this; } +}; + +#endif |