diff options
author | Alexis211 <alexis211@gmail.com> | 2009-11-13 18:05:27 +0100 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-11-13 18:05:27 +0100 |
commit | 2b9e97b8635c20c5a2b87789b1014489863d1994 (patch) | |
tree | 58fa9f2fa82ac9477819193b6731b8b927187224 /Source/Kernel | |
parent | 7e3ecd80af5ddcedbfa3d849284400ed6568f516 (diff) | |
download | Melon-2b9e97b8635c20c5a2b87789b1014489863d1994.tar.gz Melon-2b9e97b8635c20c5a2b87789b1014489863d1994.zip |
Added a game of life simulator demo
Diffstat (limited to 'Source/Kernel')
-rw-r--r-- | Source/Kernel/Core/cppsupport.wtf.cpp | 54 | ||||
-rw-r--r-- | Source/Kernel/DeviceManager/Kbd.ns.h | 85 | ||||
-rw-r--r-- | Source/Kernel/Makefile | 2 | ||||
-rw-r--r-- | Source/Kernel/SyscallManager/IDT.ns.cpp | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/FileVT.class.cpp | 4 | ||||
-rw-r--r-- | Source/Kernel/VTManager/FileVT.class.h | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/PipeVT.class.cpp | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/ScrollableVT.class.cpp | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/ScrollableVT.class.h | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/SimpleVT.class.h | 2 | ||||
-rw-r--r-- | Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp | 31 | ||||
-rw-r--r-- | Source/Kernel/VTManager/VirtualTerminal.proto.h | 12 |
12 files changed, 52 insertions, 148 deletions
diff --git a/Source/Kernel/Core/cppsupport.wtf.cpp b/Source/Kernel/Core/cppsupport.wtf.cpp deleted file mode 100644 index 06ef1b9..0000000 --- a/Source/Kernel/Core/cppsupport.wtf.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//This file just contains a few methods required for some C++ things to work -#include <types.h> - -namespace CMem { - u8int* memcpy(u8int*, const u8int*, int); -}; - -using namespace CMem; - -extern "C" void __cxa_pure_virtual() {} //Required when using abstract classes - -void *__dso_handle; //Required when using global objects -extern "C" int __cxa_atexit(void (*f)(void*), void *p, void *d) { return 0; } - -extern "C" void * memmove(void* dst, const void* src, size_t len) { - memcpy((u8int*)dst, (const u8int*)src, len); - return dst; -} - -//Functions for quad divisions/modulo. Taken and arranged from klibc include/asm/div64.h -//These only work with 32-bit divisors and only return 32-bit remainder. -//TODO : think of some correct quad div/mod algorithms -inline u64int doDiv(u64int dividend, u32int divisor, u32int *remainder) { - union { - u64int v64; - u32int v32[2]; - } d = { dividend }; - u32int upper; - - upper = d.v32[1]; - d.v32[1] = 0; - if (upper >= divisor) { - d.v32[1] = upper / divisor; - upper %= divisor; - } - asm ("divl %2" : "=a" (d.v32[0]), "=d" (*remainder) : - "rm" (divisor), "0" (d.v32[0]), "1" (upper)); - return d.v64; -} - -extern "C" { -u64int __udivdi3(u64int dividend, u64int b) { - u32int divisor, remainder; - divisor = b; - return doDiv(dividend, divisor, &remainder); -} - -u64int __umoddi3(u64int dividend, u64int b) { - u32int divisor, remainder; - divisor = b; - doDiv(dividend, divisor, &remainder); - return remainder; -} -} diff --git a/Source/Kernel/DeviceManager/Kbd.ns.h b/Source/Kernel/DeviceManager/Kbd.ns.h index 2934474..2343d46 100644 --- a/Source/Kernel/DeviceManager/Kbd.ns.h +++ b/Source/Kernel/DeviceManager/Kbd.ns.h @@ -3,94 +3,11 @@ #include <common.h> #include <WChar.class.h> - -//Used by variable kbdstatus -#define STATUS_SCRL 0x40 -#define STATUS_NUM 0x20 -#define STATUS_CAPS 0x10 -#define STATUS_SHIFT 0x08 -#define STATUS_CTRL 0x04 -#define STATUS_ALT 0x02 -#define STATUS_ALTGR 0x01 - -//Used in control keys keymap. The ones > 100 are modifiers and are not supposed to be sent to applications. -#define KBDC_LEFTCTRL 101 -#define KBDC_RIGHTCTRL 102 -#define KBDC_ALT 103 -#define KBDC_ALTGR 104 -#define KBDC_LEFTSUP 5 //Super = windows -#define KBDC_RIGHTSUP 6 -#define KBDC_MENU 7 -#define KBDC_LEFTSHIFT 108 -#define KBDC_RIGHTSHIFT 109 -#define KBDC_CAPSLOCK 110 -#define KBDC_TAB 11 -#define KBDC_ENTER 12 -#define KBDC_BACKSPACE 13 - -#define KBDC_KPINSERT 14 //Key 0/insert -#define KBDC_KPEND 15 //Key 1/end -#define KBDC_KPDOWN 16 //Key 2/down -#define KBDC_KPPGDOWN 17 //Key 3/pgdown -#define KBDC_KPLEFT 18 //Key 4/left -#define KBDC_KP5 19 //Key 5 this is sent to receiving application, but must be ignored -#define KBDC_KPRIGHT 20 //Key 6/right -#define KBDC_KPHOME 21 //Key 7/home -#define KBDC_KPUP 22 //Key 8/up -#define KBDC_KPPGUP 23 //Key 9/pgup -#define KBDC_KPDEL 24 //Key ./del - -#define KBDC_HOME 25 -#define KBDC_END 26 -#define KBDC_INSERT 27 -#define KBDC_DEL 28 -#define KBDC_PGUP 29 -#define KBDC_PGDOWN 30 -#define KBDC_UP 31 -#define KBDC_DOWN 32 -#define KBDC_LEFT 33 -#define KBDC_RIGHT 34 - -#define KBDC_NUMLOCK 135 -#define KBDC_SCRLLOCK 136 -#define KBDC_PRTSCN 37 //Print screen -#define KBDC_SYSREQ 38 - -#define KBDC_ESCAPE 40 -#define KBDC_F1 41 -#define KBDC_F2 42 -#define KBDC_F3 43 -#define KBDC_F4 44 -#define KBDC_F5 45 -#define KBDC_F6 46 -#define KBDC_F7 47 -#define KBDC_F8 48 -#define KBDC_F9 49 -#define KBDC_F10 50 -#define KBDC_F11 51 -#define KBDC_F12 52 - -//This is a special case. Keycode is escaped, Keyboard:: will send a 0xB5 keycode, that must not be mixed up with 0x35 -#define KBDC_KPSLASH 53 +#include <Kbd.iface.h> class VirtualTerminal; namespace Kbd { - //== Possible cases for keypress_t : - // - hascmd && !haschar : this is a command key press/release (all grey keys except alt/ctrl/altgr/shift) - // - haschar && !hascmd : this is a character key press/release. Modifiers can haz STATUS_SHIFT or STATUS_ALTGR - // - haschar && hascmd : this is a character key press, but with ctrl and/or alt. See that in modifiers. - // - !haschar && !hascmd : invalid keypress - struct keypress_t { - bool pressed; - bool hascmd; - bool haschar; - u8int modifiers; - u8int command; - WChar character; //is 0 if !haschar - keypress_t() : hascmd(false), haschar(false), command(0), character('\0') {}; - }; - void setFocus(VirtualTerminal* vt); bool loadKeymap(String lang); void updateLeds(); diff --git a/Source/Kernel/Makefile b/Source/Kernel/Makefile index 82498b2..a70c8c5 100644 --- a/Source/Kernel/Makefile +++ b/Source/Kernel/Makefile @@ -12,7 +12,6 @@ ASMFLAGS = -f elf OutFile = Melon.ke Objects = Core/loader.wtf.o \ Core/kmain.wtf.o \ - Core/cppsupport.wtf.o \ Core/Sys.ns.o \ Core/Log.ns.o \ MemoryManager/Mem.ns.o \ @@ -47,6 +46,7 @@ Objects = Core/loader.wtf.o \ Linker/Binary.proto.o \ Linker/MelonBinary.class.o \ Linker/ElfBinary.class.o \ + ../Library/Common/cppsupport.wtf.o \ ../Library/Common/Bitset.class.o \ ../Library/Common/String.class.o \ ../Library/Common/ByteArray.class.o \ diff --git a/Source/Kernel/SyscallManager/IDT.ns.cpp b/Source/Kernel/SyscallManager/IDT.ns.cpp index 7c4b5cb..e9e60d7 100644 --- a/Source/Kernel/SyscallManager/IDT.ns.cpp +++ b/Source/Kernel/SyscallManager/IDT.ns.cpp @@ -72,7 +72,9 @@ extern "C" void interrupt_handler(registers_t regs) { if (regs.int_no >= 40) outb(0xA0, 0x20); outb(0x20, 0x20); + asm volatile("sti"); //Make handling preemtible Dev::handleIRQ(regs, (regs.int_no - 32)); + asm volatile("cli"); doSwitch = doSwitch or Task::IRQwakeup(regs.int_no - 32); } if (regs.int_no == 64) { diff --git a/Source/Kernel/VTManager/FileVT.class.cpp b/Source/Kernel/VTManager/FileVT.class.cpp index 0acc623..5469fbd 100644 --- a/Source/Kernel/VTManager/FileVT.class.cpp +++ b/Source/Kernel/VTManager/FileVT.class.cpp @@ -31,8 +31,8 @@ void FileVT::put(WChar c, bool updatecsr) { } } -Kbd::keypress_t FileVT::getKeypress(bool show, bool block) { - Kbd::keypress_t ret; +keypress_t FileVT::getKeypress(bool show, bool block) { + keypress_t ret; if (m_isWriting) return ret; if (m_bufferPos == m_buffer.size()) { diff --git a/Source/Kernel/VTManager/FileVT.class.h b/Source/Kernel/VTManager/FileVT.class.h index ed3e224..a246ce0 100644 --- a/Source/Kernel/VTManager/FileVT.class.h +++ b/Source/Kernel/VTManager/FileVT.class.h @@ -18,7 +18,7 @@ class FileVT : public VirtualTerminal { void setCursorCol(u32int col); void put(WChar c, bool updatecsr = true); - Kbd::keypress_t getKeypress(bool show = true, bool block = true); + keypress_t getKeypress(bool show = true, bool block = true); }; #endif diff --git a/Source/Kernel/VTManager/PipeVT.class.cpp b/Source/Kernel/VTManager/PipeVT.class.cpp index 10c7e7b..7e67161 100644 --- a/Source/Kernel/VTManager/PipeVT.class.cpp +++ b/Source/Kernel/VTManager/PipeVT.class.cpp @@ -11,7 +11,7 @@ void PipeVT::setCursorCol(u32int col) { } void PipeVT::put(WChar c, bool updatecsr) { - Kbd::keypress_t kp; + keypress_t kp; if (c.value == '\t') { m_col = (m_col + 8) &~(8 - 1); kp.hascmd = true; diff --git a/Source/Kernel/VTManager/ScrollableVT.class.cpp b/Source/Kernel/VTManager/ScrollableVT.class.cpp index ca0075a..264c3a4 100644 --- a/Source/Kernel/VTManager/ScrollableVT.class.cpp +++ b/Source/Kernel/VTManager/ScrollableVT.class.cpp @@ -69,7 +69,7 @@ void ScrollableVT::scroll() { SimpleVT::scroll(); } -void ScrollableVT::keyPress(Kbd::keypress_t kp) { +void ScrollableVT::keyPress(keypress_t kp) { if (kp.hascmd && kp.modifiers == STATUS_SHIFT) { s32int nlup = m_linesup; if (kp.command == KBDC_PGUP) { diff --git a/Source/Kernel/VTManager/ScrollableVT.class.h b/Source/Kernel/VTManager/ScrollableVT.class.h index fbc2c4c..6d29645 100644 --- a/Source/Kernel/VTManager/ScrollableVT.class.h +++ b/Source/Kernel/VTManager/ScrollableVT.class.h @@ -18,7 +18,7 @@ class ScrollableVT : public SimpleVT { void redraw(); void scroll(); - void keyPress(Kbd::keypress_t kp); + void keyPress(keypress_t kp); }; #endif diff --git a/Source/Kernel/VTManager/SimpleVT.class.h b/Source/Kernel/VTManager/SimpleVT.class.h index 6a50549..9eda6de 100644 --- a/Source/Kernel/VTManager/SimpleVT.class.h +++ b/Source/Kernel/VTManager/SimpleVT.class.h @@ -22,6 +22,8 @@ class SimpleVT : public VirtualTerminal { void clear(); void setColor(u8int fgcolor, u8int bgcolor = 0xFF); bool isBoxed() { return true; } + u8int height() { return m_rows; } + u8int width() { return m_cols; } void map(s32int row = -1, s32int col = -1); void unmap(); diff --git a/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp b/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp index 5506c74..47941c6 100644 --- a/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp +++ b/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp @@ -8,10 +8,14 @@ call_t VirtualTerminal::m_callTable[] = { CALL1(VTIF_WRITE, &VirtualTerminal::writeSC), CALL1(VTIF_PUT, &VirtualTerminal::putSC), CALL1(VTIF_READLINE, &VirtualTerminal::readLineSC), + CALL1(VTIF_GETKEYPRESS, &VirtualTerminal::getKeypressSC), CALL1(VTIF_SETCOLOR, &VirtualTerminal::setColorSC), CALL1(VTIF_SETCSRLINE, &VirtualTerminal::setCursorLineSC), CALL1(VTIF_SETCSRCOL, &VirtualTerminal::setCursorColSC), CALL0(VTIF_ISBOXED, &VirtualTerminal::isBoxedSC), + CALL0(VTIF_GETHEIGHT, &VirtualTerminal::getHeightSC), + CALL0(VTIF_GETWIDTH, &VirtualTerminal::getWidthSC), + CALL2(VTIF_LOCATE, &VirtualTerminal::locateSC), CALL0(0, 0) }; @@ -47,6 +51,14 @@ u32int VirtualTerminal::readLineSC(u32int show) { return readLine(show != 0).serialize(); } +u32int VirtualTerminal::getKeypressSC(u32int flags) { + bool show = (flags & 1), block = (flags & 2); + keypress_t temp = getKeypress(show, block); + void* ptr = Mem::mkXchgSpace(sizeof(keypress_t)); + memcpy((u8int*)ptr, (const u8int*)&temp, sizeof(keypress_t)); + return (u32int)ptr; +} + u32int VirtualTerminal::setColorSC(u32int x) { setColor((x >> 8) & 0xFF, x & 0xFF); return 0; @@ -65,3 +77,22 @@ u32int VirtualTerminal::setCursorColSC(u32int c) { u32int VirtualTerminal::isBoxedSC() { return (isBoxed() ? 1 : 0); } + +u32int VirtualTerminal::getHeightSC() { + return height(); +} + +u32int VirtualTerminal::getWidthSC() { + return width(); +} + +u32int VirtualTerminal::locateSC(u32int line, u32int col) { + if (line < 1000 and col < 1000) { + moveCursor(line, col); + } else if (line < 1000) { + setCursorLine(line); + } else if (col < 1000) { + setCursorCol(line); + } + return 0; +} diff --git a/Source/Kernel/VTManager/VirtualTerminal.proto.h b/Source/Kernel/VTManager/VirtualTerminal.proto.h index 9c138ec..5f874b4 100644 --- a/Source/Kernel/VTManager/VirtualTerminal.proto.h +++ b/Source/Kernel/VTManager/VirtualTerminal.proto.h @@ -17,7 +17,7 @@ struct vtchr { class VirtualTerminal : public Ressource { protected: Mutex m_kbdMutex, m_kbdbuffMutex; - Vector<Kbd::keypress_t> m_kbdbuff; //Key press events buffer + Vector<keypress_t> m_kbdbuff; //Key press events buffer //SYSCALLS : static call_t m_callTable[]; @@ -26,10 +26,14 @@ class VirtualTerminal : public Ressource { u32int writeSC(u32int); u32int putSC(u32int); u32int readLineSC(u32int); + u32int getKeypressSC(u32int); u32int setColorSC(u32int); u32int setCursorLineSC(u32int); u32int setCursorColSC(u32int); u32int isBoxedSC(); + u32int getHeightSC(); + u32int getWidthSC(); + u32int locateSC(u32int, u32int); bool accessible() { return true; } public: @@ -40,6 +44,8 @@ class VirtualTerminal : public Ressource { virtual void setColor(u8int fgcolor, u8int bgcolor = 0xFF) {} //For a pipe/file VT, this will do nothing. virtual bool isBoxed() = 0; + virtual u8int height() { return 0; } + virtual u8int width() { return 0; } virtual void updateCursor() {} virtual void moveCursor(u32int row, u32int col) {} //These are not implemented for pipe/file VTs @@ -60,8 +66,8 @@ class VirtualTerminal : public Ressource { inline VirtualTerminal& operator<<(u32int i) { writeHex(i); return *this; } //Keyboard functions - virtual void keyPress(Kbd::keypress_t kp); //Called by Kbd:: when a key is pressed, overloaded by ScrollableVT - virtual Kbd::keypress_t getKeypress(bool show = true, bool block = true); //Block : must we wait for a key to be pressed ? + virtual void keyPress(keypress_t kp); //Called by Kbd:: when a key is pressed, overloaded by ScrollableVT + virtual keypress_t getKeypress(bool show = true, bool block = true); //Block : must we wait for a key to be pressed ? String readLine(bool show = true); }; |