From 26f99e99a8943a523593a8ff1323e5e30b197a1c Mon Sep 17 00:00:00 2001
From: mntmn <lukas@mntmn.com>
Date: Wed, 28 Aug 2019 17:57:05 +0200
Subject: [PATCH] add 'blur' example

---
 blur/blur.c        | 106 +++++++++++++++++++++++++++++++++++++++++++++
 blur/build-blur.sh |  22 ++++++++++
 2 files changed, 128 insertions(+)
 create mode 100644 blur/blur.c
 create mode 100755 blur/build-blur.sh

diff --git a/blur/blur.c b/blur/blur.c
new file mode 100644
index 0000000..45f2815
--- /dev/null
+++ b/blur/blur.c
@@ -0,0 +1,106 @@
+/*
+ * MNT ZZ9000 Amiga Graphics and ARM Coprocessor SDK
+ *            Code example: "blur"
+ *
+ * Copyright (C) 2019, Lukas F. Hartmann <lukas@mntre.com>
+ *                     MNT Research GmbH, Berlin
+ *                     https://mntre.com
+ *
+ * More Info: https://mntre.com/zz9000
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ * GNU General Public License v3.0 or later
+ *
+ * https://spdx.org/licenses/GPL-3.0-or-later.html
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include "printf/printf.h"
+#include "zz9k_env.h"
+
+static uint32_t* fb=0;
+static uint32_t fb_pitch=0;
+
+struct ZZ9K_ENV* _zz9k_env;
+
+#define ZZ9K_APP_DATASPACE 0x05000000
+
+void __aeabi_idiv0(int r) {
+  printf("__aeabi_idiv0()!\n");
+  while (1) {
+  }
+}
+void __aeabi_ldiv0(int r) {
+  printf("__aeabi_idiv0()!\n");
+  while (1) {
+  }
+}
+
+int errno_var = 0;
+int* __errno() {
+  return &errno_var;
+}
+void _putchar(char c) {
+  _zz9k_env->putchar(c);
+};
+
+void set_fb(uint32_t* fb_, uint32_t pitch) {
+	fb=fb_;
+	fb_pitch=pitch;
+}
+
+void blur() {
+	for (int y=0; y<480; y++) {
+    for (int x=0; x<640; x++) {
+      uint32_t s1 = fb[y*fb_pitch+x-1];
+      uint32_t s2 = fb[y*fb_pitch+x+1];
+      uint32_t s3 = fb[(y-1)*fb_pitch+x];
+      uint32_t s4 = fb[(y+1)*fb_pitch+x];
+
+      uint32_t s1r = (s1>>16)&0xff;
+      uint32_t s1g = (s1>>8)&0xff;
+      uint32_t s1b = s1&0xff;
+      uint32_t s2r = (s2>>16)&0xff;
+      uint32_t s2g = (s2>>8)&0xff;
+      uint32_t s2b = s2&0xff;
+      uint32_t s3r = (s3>>16)&0xff;
+      uint32_t s3g = (s3>>8)&0xff;
+      uint32_t s3b = s3&0xff;
+      uint32_t s4r = (s4>>16)&0xff;
+      uint32_t s4g = (s4>>8)&0xff;
+      uint32_t s4b = s4&0xff;
+
+      uint32_t r = (s1r+s2r+s3r+s4r)/4;
+      if (r>0xff) r = 0xff;
+      uint32_t g = (s1g+s2g+s3g+s4g)/4;
+      if (g>0xff) g = 0xff;
+      uint32_t b = (s1b+s2b+s3b+s4b)/4;
+      if (b>0xff) b = 0xff;
+      
+      fb[y*fb_pitch+x] = (r<<16)|(g<<8)|b;
+    }
+	}
+}
+
+int __attribute__ ((section (".binstart"))) main(struct ZZ9K_ENV* env) {
+  _zz9k_env = env;
+
+  if (!env) {
+    return 1;
+  }
+  
+  if (env->argc<2) {
+    return 1;
+  }
+
+  // arg0: framebuffer pointer
+  // arg1: screen width
+  set_fb((uint32_t*)env->argv[0],env->argv[1]);
+
+  while (1) {
+    blur();
+  }
+  
+  return 0;
+}
diff --git a/blur/build-blur.sh b/blur/build-blur.sh
new file mode 100755
index 0000000..5b5a97a
--- /dev/null
+++ b/blur/build-blur.sh
@@ -0,0 +1,22 @@
+COMPILE="arm-none-eabi-gcc -std=gnu99 -nostdlib -O2 -c -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -I../lib -I../include"
+LINK="arm-none-eabi-gcc -T ../link.ld -std=gnu99 -nostdlib -O2 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard"
+NAME=blur
+
+cppcheck --template='{file}:{line}:{severity}:{message}' --enable=all -I. $NAME.c
+
+mkdir -p build
+
+$COMPILE -I. -ftree-vectorize -o build/$NAME.o $NAME.c
+$COMPILE -o build/idiv.o ../lib/div/idiv.S
+$COMPILE -o build/idivmod.o ../lib/div/idivmod.S
+$COMPILE -o build/ldivmod.o ../lib/div/ldivmod.S
+$COMPILE -o build/memset.o ../lib/memory/memset.c
+$COMPILE -o build/memcpy.o ../lib/memory/memcpy.c
+$COMPILE -o build/printf.o ../lib/printf/printf.c
+
+$LINK -o $NAME build/$NAME.o build/memcpy.o build/memset.o build/printf.o build/*div*.o -L. -lm
+arm-none-eabi-objcopy -O binary $NAME $NAME.bin
+
+rm $NAME.lha
+lha a0 $NAME.lha $NAME.bin
+
-- 
GitLab