summaryrefslogtreecommitdiff
path: root/Source/Library
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Library')
-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.cpp54
-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
8 files changed, 179 insertions, 7 deletions
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/Library/Common/cppsupport.wtf.cpp b/Source/Library/Common/cppsupport.wtf.cpp
new file mode 100644
index 0000000..06ef1b9
--- /dev/null
+++ b/Source/Library/Common/cppsupport.wtf.cpp
@@ -0,0 +1,54 @@
+//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/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;