summaryrefslogtreecommitdiff
path: root/Source
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
parent7e3ecd80af5ddcedbfa3d849284400ed6568f516 (diff)
downloadMelon-2b9e97b8635c20c5a2b87789b1014489863d1994.tar.gz
Melon-2b9e97b8635c20c5a2b87789b1014489863d1994.zip
Added a game of life simulator demo
Diffstat (limited to 'Source')
-rw-r--r--Source/Applications/Demos/GOL.cpp95
-rw-r--r--Source/Applications/Demos/Makefile (renamed from Source/Applications/SampleApps/Makefile)2
-rw-r--r--Source/Applications/Demos/asmdemo.asm (renamed from Source/Applications/SampleApps/asmdemo.asm)0
-rw-r--r--Source/Applications/Demos/cxxdemo.cpp (renamed from Source/Applications/SampleApps/cxxdemo.cpp)0
-rw-r--r--Source/Applications/Demos/lib-melonasm.asm (renamed from Source/Applications/SampleApps/lib-melonasm.asm)0
-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
-rw-r--r--Source/Library/Common/Mutex.class.cpp2
-rw-r--r--Source/Library/Common/Rand.ns.cpp2
-rw-r--r--Source/Library/Common/cppsupport.wtf.cpp (renamed from Source/Kernel/Core/cppsupport.wtf.cpp)0
-rw-r--r--Source/Library/Interface/Kbd.iface.h98
-rw-r--r--Source/Library/Interface/VirtualTerminal.iface.h5
-rw-r--r--Source/Library/Makefile4
-rw-r--r--Source/Library/Userland/Binding/VirtualTerminal.class.h17
-rw-r--r--Source/Library/Userland/Start.cpp4
24 files changed, 273 insertions, 102 deletions
diff --git a/Source/Applications/Demos/GOL.cpp b/Source/Applications/Demos/GOL.cpp
new file mode 100644
index 0000000..6dd1cdf
--- /dev/null
+++ b/Source/Applications/Demos/GOL.cpp
@@ -0,0 +1,95 @@
+#include <Binding/VirtualTerminal.class.h>
+#include <Binding/Thread.class.h>
+#include <String.class.h>
+#include <Rand.ns.h>
+
+int main(Vector<String> args) {
+ if (!outvt.isBoxed()) {
+ outvt << "Error : cannot display GOL on a non-boxed terminal.\n";
+ return 1;
+ }
+
+ int h = outvt.height() - 1, w = outvt.width();
+
+ bool *cells = new bool[w * h];
+ bool *newcells = new bool[w * h];
+
+ u32int delay = 100;
+
+ for (u32int x = 0; x < w; x++) {
+ for (u32int y = 0; y < h; y++) {
+ cells[x * h + y] = false;
+ }
+ }
+
+ while (1) {
+ //Display cells
+ outvt.moveCursor(0, 0);
+ for (u32int y = 0; y < h; y++) {
+ for (u32int x = 0; x < w; x++) {
+ if (cells[x * h + y]) {
+ outvt.setColor(0, 2);
+ } else {
+ outvt.setColor(7, 0);
+ }
+ outvt << " ";
+ }
+ }
+ outvt << "Press Ctrl+h for help";
+
+ //Compute next generation
+ for (u32int y = 0; y < h; y++) {
+ for (u32int x = 0; x < w; x++) {
+ u8int n = 0;
+ for (u32int yy = y - 1; yy <= y + 1; yy++) {
+ for (u32int xx = x - 1; xx <= x + 2; xx++) {
+ if (xx < w and yy < h and cells[xx * h + yy]) n++;
+ }
+ }
+ if (cells[x * h + y]) n--;
+ if ((cells[x * h + y] and n == 2) or n == 3) {
+ newcells[x * h + y] = true;
+ } else {
+ newcells[x * h + y] = false;
+ }
+ }
+ }
+ for (u32int x = 0; x < w; x++) {
+ for (u32int y = 0; y < h; y++) {
+ cells[x * h + y] = newcells[x * h + y];
+ }
+ }
+
+ keypress_t kp = invt.getKeypress(false, false);
+ if (kp.hascmd && (kp.modifiers & STATUS_CTRL)) {
+ if (kp.character == WChar("c")) {
+ break;
+ } else if (kp.character == WChar("r")) {
+ for (u32int i = 0; i < 20; i++) {
+ u64int x = Rand::rand() * w / Rand::max();
+ u64int y = Rand::rand() * h / Rand::max();
+ cells[x * h + y] = true;
+ }
+ } else if (kp.character == WChar("R")) {
+ for (u32int i = 0; i < h; i++) {
+ cells[i] = true;
+ cells[(2 * i) % (h - i)] = true;
+ cells[(w * i) % (h * w - i)] = true;
+ }
+ } else if (kp.character == WChar("h")) {
+ outvt << "** Melon's demo Game Of Life Simulator help :\n";
+ outvt << " - ctrl+c : quit\n";
+ outvt << " - ctrl+h : show this\n";
+ outvt << " - ctrl+r : add some random cells\n";
+ outvt << " - ctrl+R : add more cells, but not random\n";
+ outvt << "Press any key to return to simultaor...";
+ invt.getKeypress();
+ }
+ }
+
+ Thread::get().sleep(100);
+ }
+
+ delete cells;
+ delete newcells;
+}
diff --git a/Source/Applications/SampleApps/Makefile b/Source/Applications/Demos/Makefile
index 05f79b1..e66acce 100644
--- a/Source/Applications/SampleApps/Makefile
+++ b/Source/Applications/Demos/Makefile
@@ -9,7 +9,7 @@ CXXFLAGS = -nostartfiles -nostdlib -ffreestanding -fno-exceptions -fno-rtti -I .
LD = ld
LDFLAGS = -T ../../Library/Link.ld -L ../../Library
-Applications = asmdemo cxxdemo
+Applications = asmdemo cxxdemo GOL
all: $(Applications)
echo "* Done with applications : $(Applications)"
diff --git a/Source/Applications/SampleApps/asmdemo.asm b/Source/Applications/Demos/asmdemo.asm
index d57cc9b..d57cc9b 100644
--- a/Source/Applications/SampleApps/asmdemo.asm
+++ b/Source/Applications/Demos/asmdemo.asm
diff --git a/Source/Applications/SampleApps/cxxdemo.cpp b/Source/Applications/Demos/cxxdemo.cpp
index 3d452e7..3d452e7 100644
--- a/Source/Applications/SampleApps/cxxdemo.cpp
+++ b/Source/Applications/Demos/cxxdemo.cpp
diff --git a/Source/Applications/SampleApps/lib-melonasm.asm b/Source/Applications/Demos/lib-melonasm.asm
index 0845770..0845770 100644
--- a/Source/Applications/SampleApps/lib-melonasm.asm
+++ b/Source/Applications/Demos/lib-melonasm.asm
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);
};
diff --git a/Source/Library/Common/Mutex.class.cpp b/Source/Library/Common/Mutex.class.cpp
index 2e9a63c..d7d7ead 100644
--- a/Source/Library/Common/Mutex.class.cpp
+++ b/Source/Library/Common/Mutex.class.cpp
@@ -41,5 +41,5 @@ void Mutex::unlock() {
}
bool Mutex::locked() {
- return m_locked;
+ return m_locked == MUTEX_TRUE;
}
diff --git a/Source/Library/Common/Rand.ns.cpp b/Source/Library/Common/Rand.ns.cpp
index e568678..6323ccc 100644
--- a/Source/Library/Common/Rand.ns.cpp
+++ b/Source/Library/Common/Rand.ns.cpp
@@ -7,7 +7,7 @@ u64int current = RANDOM_SEED;
u64int rand() {
current = (u32int)(a*current + b);
- while (current > m) current -= m;
+ if (current > m) current = current % m;
return current;
}
diff --git a/Source/Kernel/Core/cppsupport.wtf.cpp b/Source/Library/Common/cppsupport.wtf.cpp
index 06ef1b9..06ef1b9 100644
--- a/Source/Kernel/Core/cppsupport.wtf.cpp
+++ b/Source/Library/Common/cppsupport.wtf.cpp
diff --git a/Source/Library/Interface/Kbd.iface.h b/Source/Library/Interface/Kbd.iface.h
new file mode 100644
index 0000000..5627605
--- /dev/null
+++ b/Source/Library/Interface/Kbd.iface.h
@@ -0,0 +1,98 @@
+#ifndef DEF_KBD_IFACE_H
+#define DEF_KBD_IFACE_H
+
+#include <WChar.class.h>
+
+/*
+ * Some of these values are used internally by the kernel, just take whatever you need.
+ */
+
+//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
+
+/*
+ * This type defines a keypress event.
+ */
+
+//== 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') {};
+};
+
+#endif
diff --git a/Source/Library/Interface/VirtualTerminal.iface.h b/Source/Library/Interface/VirtualTerminal.iface.h
index c6388e6..c7e75e8 100644
--- a/Source/Library/Interface/VirtualTerminal.iface.h
+++ b/Source/Library/Interface/VirtualTerminal.iface.h
@@ -13,10 +13,15 @@
#define VTIF_WRITE 0x04
#define VTIF_READLINE 0x05
+#define VTIF_GETKEYPRESS 0x06 //Takes two flags : 1<<0 = show, 1<<1 = block
#define VTIF_SETCOLOR 0x10
#define VTIF_SETCSRLINE 0x11
#define VTIF_SETCSRCOL 0x12
#define VTIF_ISBOXED 0x13
+#define VTIF_GETHEIGHT 0x1A
+#define VTIF_GETWIDTH 0x1B
+#define VTIF_LOCATE 0x1C //Takes line, col and sets cursor position
+
#endif
diff --git a/Source/Library/Makefile b/Source/Library/Makefile
index 5a7a039..5c77c84 100644
--- a/Source/Library/Makefile
+++ b/Source/Library/Makefile
@@ -1,7 +1,7 @@
.PHONY: clean, mrproper
CXX = g++
-CXXFLAGS = -nostartfiles -nostdlib -ffreestanding -fno-exceptions -fno-rtti -I Common -I Userland -I Interface -D THIS_IS_MELON_USERLAND
+CXXFLAGS = -nostartfiles -nostdlib -ffreestanding -fno-exceptions -fno-rtti -I Common -I Userland -I Interface -D THIS_IS_MELON_USERLAND -D RANDOM_SEED=1`date +%N`LL
ASM = nasm
ASMFLAGS = -f elf
@@ -18,6 +18,8 @@ Objects = Common/WChar.class.uo \
Common/String.class.uo \
Common/TextFile.class.uo \
Common/ByteArray.class.uo \
+ Common/Rand.ns.uo \
+ Common/cppsupport.wtf.uo \
Userland/Syscall/Syscall.wtf.uo \
Userland/Syscall/RessourceCaller.class.uo \
Userland/Start.uo
diff --git a/Source/Library/Userland/Binding/VirtualTerminal.class.h b/Source/Library/Userland/Binding/VirtualTerminal.class.h
index 5fd9733..c8a4123 100644
--- a/Source/Library/Userland/Binding/VirtualTerminal.class.h
+++ b/Source/Library/Userland/Binding/VirtualTerminal.class.h
@@ -4,6 +4,7 @@
#include <Syscall/RessourceCaller.class.h>
#include <VirtualTerminal.iface.h>
+#include <Kbd.iface.h>
#include <String.class.h>
#include <WChar.class.h>
@@ -29,6 +30,10 @@ class VirtualTerminal : public RessourceCaller {
void write(String s) {
doCall(VTIF_WRITE, (u32int)&s);
}
+ keypress_t getKeypress(bool show = true, bool block = true) {
+ keypress_t* ptr = (keypress_t*)doCall(VTIF_GETKEYPRESS, (show ? 1 : 0) | (block ? 2 : 0));
+ return *ptr;
+ }
String readLine(bool show = true) {
return String::unserialize(doCall(VTIF_READLINE, (show ? 1 : 0)));
}
@@ -44,9 +49,21 @@ class VirtualTerminal : public RessourceCaller {
bool isBoxed() {
return doCall(VTIF_ISBOXED) != 0;
}
+ u8int height() {
+ return doCall(VTIF_GETHEIGHT);
+ }
+ u8int width() {
+ return doCall(VTIF_GETWIDTH);
+ }
void put(WChar c) {
doCall(VTIF_PUT, c);
}
+ void moveCursor(u8int line, u8int col) {
+ doCall(VTIF_LOCATE, line, col);
+ }
+ void put(u8int line, u8int col, WChar c) {
+ moveCursor(line, col); put(c);
+ }
inline VirtualTerminal& operator<<(const String& s) { write(s); return *this; }
inline VirtualTerminal& operator<<(s32int i) { writeDec(i); return *this; }
diff --git a/Source/Library/Userland/Start.cpp b/Source/Library/Userland/Start.cpp
index 032450d..0c25491 100644
--- a/Source/Library/Userland/Start.cpp
+++ b/Source/Library/Userland/Start.cpp
@@ -4,10 +4,6 @@
#include <Heap.class.h>
-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 u32int start_ctors, end_ctors, start_dtors, end_dtors;
Heap heap;