bogomips: because ...
authorAlan Cox <alan@linux.intel.com>
Tue, 24 Oct 2017 18:26:46 +0000 (19:26 +0100)
committerAlan Cox <alan@linux.intel.com>
Tue, 24 Oct 2017 18:26:46 +0000 (19:26 +0100)
Z80 4MHz 0.2 bogomips
FPGA Z80 128MHz 10.55 bogomips - beats an Intel 386 ;)

Applications/util/Makefile.z80
Applications/util/bogomips.c [new file with mode: 0644]

index 1519462..603444d 100644 (file)
@@ -52,6 +52,7 @@ SRCSNS = \
 
 SRCS  = banner.c \
        bd.c \
+       bogomips.c \
        cal.c \
        cksum.c \
        cut.c \
diff --git a/Applications/util/bogomips.c b/Applications/util/bogomips.c
new file mode 100644 (file)
index 0000000..a7440d0
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#ifdef __SDCC_z80
+void delay(unsigned long r)
+{
+__asm
+    pop hl     ; return address
+    pop de     ; low
+    pop bc     ; high
+    
+loop:
+    dec de
+    ld a,d
+    or e
+    jp nz,loop
+    ld a,b
+    or c
+    dec bc
+    jp nz,loop
+    push bc
+    push de
+    jp (hl)
+__endasm;
+}
+#else
+#error "Unsupported platform"
+#endif
+
+int main(int argc, char *argv[])
+{
+    unsigned long loops_per_sec = 1 ;
+    clock_t ticks;
+    unsigned int cps = sysconf(_SC_CLK_TCK);
+    
+    printf("Calibrating delay loop... ");
+    fflush(stdout);
+    
+    while (loops_per_sec <<= 1) {
+        ticks = clock();
+        delay(loops_per_sec);
+        ticks = clock() - ticks;
+        if (ticks >= cps) {
+            unsigned long lps = (loops_per_sec * cps) / ticks;
+            printf("ok - %lu.%02lu BogoMips\n",
+                lps / 500000UL, (lps / 5000) % 100);
+            return 0;
+        }
+    }
+    printf("failed\n");
+    return -1;
+}