summaryrefslogtreecommitdiff
path: root/Source/Applications/Demos
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Applications/Demos')
-rw-r--r--Source/Applications/Demos/GOL.cpp95
-rw-r--r--Source/Applications/Demos/Makefile35
-rw-r--r--Source/Applications/Demos/asmdemo.asm30
-rw-r--r--Source/Applications/Demos/cxxdemo.cpp20
-rw-r--r--Source/Applications/Demos/lib-melonasm.asm24
5 files changed, 204 insertions, 0 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/Demos/Makefile b/Source/Applications/Demos/Makefile
new file mode 100644
index 0000000..e66acce
--- /dev/null
+++ b/Source/Applications/Demos/Makefile
@@ -0,0 +1,35 @@
+.PHONY: clean, mrproper
+
+ASM = nasm
+ASMFLAGS = -f bin
+
+CXX = g++
+CXXFLAGS = -nostartfiles -nostdlib -ffreestanding -fno-exceptions -fno-rtti -I ../../Library/Common -I ../../Library/Interface -I ../../Library/Userland -D THIS_IS_MELON_USERLAND
+
+LD = ld
+LDFLAGS = -T ../../Library/Link.ld -L ../../Library
+
+Applications = asmdemo cxxdemo GOL
+
+all: $(Applications)
+ echo "* Done with applications : $(Applications)"
+
+rebuild: mrproper all
+
+%: %.cpp
+ echo "* Compiling $<..."
+ $(CXX) $(CXXFLAGS) -c $< -o $@.o
+ echo "* Linking $@.o..."
+ $(LD) $(LDFLAGS) $@.o -o $@
+
+%: %.asm
+ echo "* Compiling $<..."
+ $(ASM) $(ASMFLAGS) -o $@ $<
+
+clean:
+ echo "* Removing object files..."
+ rm -rf *.o
+
+mrproper: clean
+ echo "* Removing applications..."
+ rm -rf $(Applications)
diff --git a/Source/Applications/Demos/asmdemo.asm b/Source/Applications/Demos/asmdemo.asm
new file mode 100644
index 0000000..d57cc9b
--- /dev/null
+++ b/Source/Applications/Demos/asmdemo.asm
@@ -0,0 +1,30 @@
+%include "lib-melonasm.asm"
+
+start: ; label used for calculating app size
+ mov ecx, [data]
+ mov ebx, ecx
+ mov eax, SC_WHEX
+ int 64
+ mov eax, SC_PUTCH
+ mov ebx, 10
+ int 64
+lblloop:
+ inc ecx
+ mov eax, SC_PUTCH ;temporarily defined for writing one char to screen
+ mov ebx, ecx
+ int 64
+ mov eax, SC_SLEEP ;temporary syscall for sleeping
+ mov ebx, 30 ;20ms
+ int 64
+ cmp ecx, 127
+ jnz lblloop
+ mov eax, 0
+ mov eax, SC_PUTCH
+ mov ebx, 10 ;newline
+ int 64
+ int 66 ;finish task
+
+data:
+dd 0x00000020
+
+end: ; label used for calculating app size
diff --git a/Source/Applications/Demos/cxxdemo.cpp b/Source/Applications/Demos/cxxdemo.cpp
new file mode 100644
index 0000000..3d452e7
--- /dev/null
+++ b/Source/Applications/Demos/cxxdemo.cpp
@@ -0,0 +1,20 @@
+#include <Syscall/Syscall.wtf.h>
+#include <String.class.h>
+#include <Binding/VirtualTerminal.class.h>
+#include <Binding/Thread.class.h>
+#include <Binding/File.class.h>
+
+int main(const Vector<String>& args) {
+ outvt << "Enter some text plz : ";
+ String s = invt.readLine();
+ outvt << s;
+ Thread t = Thread::get();
+ for (char c = ' '; c <= 'z'; c++) {
+ t.sleep((u32int)c / 4);
+ outvt.put(c);
+ }
+ outvt << "\n";
+ outvt << "Salut les gens ! c'est le progrès !!!\nLe boeuf mort est juste là : ";
+ outvt << 0xDEADBEEF;
+ outvt << "\n";
+}
diff --git a/Source/Applications/Demos/lib-melonasm.asm b/Source/Applications/Demos/lib-melonasm.asm
new file mode 100644
index 0000000..0845770
--- /dev/null
+++ b/Source/Applications/Demos/lib-melonasm.asm
@@ -0,0 +1,24 @@
+[bits 32]
+
+%ifidn __OUTPUT_FORMAT__, bin
+; create a MelonBinary output
+
+%define MEM_ORIGIN 0x10000000
+
+dd 0xFEEDBEEF ; magic number ^^
+dd end - start
+dd MEM_ORIGIN
+
+; the ($-$$) permits not taking into account the header above
+[org MEM_ORIGIN - ($-$$)]
+
+%elifidn __OUTPUT_FORMAT__, elf
+; create an elf object
+
+[global start]
+
+%endif
+
+%define SC_PUTCH 0xFFFFFF01
+%define SC_SLEEP 0xFFFFFF02
+%define SC_WHEX 0xFFFFFF03