summaryrefslogtreecommitdiff
path: root/Source/Kernel
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-11-13 18:05:27 +0100
committerAlexis211 <alexis211@gmail.com>2009-11-13 18:05:27 +0100
commit2b9e97b8635c20c5a2b87789b1014489863d1994 (patch)
tree58fa9f2fa82ac9477819193b6731b8b927187224 /Source/Kernel
parent7e3ecd80af5ddcedbfa3d849284400ed6568f516 (diff)
downloadMelon-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.cpp54
-rw-r--r--Source/Kernel/DeviceManager/Kbd.ns.h85
-rw-r--r--Source/Kernel/Makefile2
-rw-r--r--Source/Kernel/SyscallManager/IDT.ns.cpp2
-rw-r--r--Source/Kernel/VTManager/FileVT.class.cpp4
-rw-r--r--Source/Kernel/VTManager/FileVT.class.h2
-rw-r--r--Source/Kernel/VTManager/PipeVT.class.cpp2
-rw-r--r--Source/Kernel/VTManager/ScrollableVT.class.cpp2
-rw-r--r--Source/Kernel/VTManager/ScrollableVT.class.h2
-rw-r--r--Source/Kernel/VTManager/SimpleVT.class.h2
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp31
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.proto.h12
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);
};