From 1213c5673f1ffe843147a83de02837decc90d870 Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Thu, 11 Dec 2025 12:48:41 +0000 Subject: [PATCH] Do .bin inclusion in C code at build --- apps/self/Makefile | 4 +++- apps/self/mandel.h | 28 ++++++++++++++++++++++++++++ apps/self/self.c | 29 ++--------------------------- host-mini/Makefile | 1 + host-mini/host-mini.c | 29 ++--------------------------- host-mini/mandel.h | 28 ++++++++++++++++++++++++++++ precompiled/maze.bin | Bin 1492 -> 1540 bytes precompiled/self.bin | Bin 5256 -> 5780 bytes 8 files changed, 64 insertions(+), 55 deletions(-) create mode 100644 apps/self/mandel.h create mode 100644 host-mini/mandel.h diff --git a/apps/self/Makefile b/apps/self/Makefile index 44d34fe..7c6cf20 100644 --- a/apps/self/Makefile +++ b/apps/self/Makefile @@ -2,7 +2,9 @@ TOPDIR=../../ PROJECT:=$(shell basename ${PWD}) SRCS=${PROJECT}.c ${TOPDIR}/apps/crt0.S ${TOPDIR}/uvm32/uvm32.c CFLAGS=-DUVM32_MEMORY_SIZE=8192 -DCUSTOM_STDLIB_H=\"uvm32_target.h\" -I../../uvm32 -all: all_common +all: + xxd -n mandel -i ${TOPDIR}/precompiled/mandel.bin | sed -e "s/unsigned char/const unsigned char/" > mandel.h + make all_common test: test_common clean: clean_common include ${TOPDIR}/apps/makefile.common diff --git a/apps/self/mandel.h b/apps/self/mandel.h new file mode 100644 index 0000000..21f8d81 --- /dev/null +++ b/apps/self/mandel.h @@ -0,0 +1,28 @@ +const unsigned char mandel[] = { + 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x13, 0xb7, 0x08, 0x00, 0x01, + 0x93, 0x88, 0x28, 0x00, 0x73, 0x00, 0x00, 0x00, 0x23, 0x26, 0x11, 0x00, + 0xef, 0x00, 0xc0, 0x00, 0xb7, 0x08, 0x00, 0x01, 0x73, 0x00, 0x00, 0x00, + 0x13, 0x01, 0x01, 0xff, 0x23, 0x26, 0x81, 0x00, 0x37, 0xf5, 0xff, 0xff, + 0xb7, 0x15, 0x00, 0x00, 0x37, 0xe6, 0xff, 0xff, 0x13, 0x07, 0xf0, 0x01, + 0xb7, 0x47, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x01, 0x13, 0x08, 0xd5, 0xcc, + 0x93, 0x82, 0x35, 0x33, 0x13, 0x03, 0x76, 0xe6, 0x93, 0x83, 0x35, 0xb3, + 0x13, 0x86, 0x16, 0x00, 0x63, 0xce, 0x02, 0x09, 0x13, 0x0e, 0x03, 0x00, + 0x63, 0xce, 0x63, 0x06, 0x93, 0x0f, 0x00, 0x00, 0x13, 0x0f, 0x00, 0x00, + 0x13, 0x04, 0x00, 0x00, 0x93, 0x0e, 0x00, 0x00, 0x93, 0x06, 0x00, 0x02, + 0x13, 0x85, 0x06, 0xfe, 0x63, 0x64, 0xa7, 0x04, 0x33, 0x05, 0xff, 0x01, + 0x63, 0xe0, 0xa7, 0x04, 0x13, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x06, 0x00, 0xb3, 0x8e, 0x8e, 0x02, 0x33, 0x0f, 0xff, 0x41, + 0x13, 0xd4, 0xbe, 0x40, 0xb3, 0x0e, 0xcf, 0x01, 0x73, 0x00, 0x00, 0x00, + 0x33, 0x04, 0x04, 0x01, 0x33, 0x85, 0xde, 0x03, 0x13, 0x5f, 0xc5, 0x00, + 0x33, 0x05, 0x84, 0x02, 0x93, 0x5f, 0xc5, 0x00, 0x93, 0x86, 0x16, 0x00, + 0x6f, 0xf0, 0x9f, 0xfb, 0x13, 0x85, 0x06, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x0e, 0x1e, 0x09, + 0xe3, 0xd6, 0xc3, 0xf9, 0x13, 0x05, 0xa0, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x08, 0x98, 0x19, + 0xe3, 0xd6, 0x02, 0xf7, 0x37, 0x05, 0x00, 0x80, 0x13, 0x05, 0x05, 0x12, + 0x93, 0x08, 0x30, 0x00, 0x93, 0x05, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x03, 0x24, 0xc1, 0x00, 0x13, 0x01, 0x01, 0x01, 0x67, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x00 +}; +unsigned int mandel_len = 300; diff --git a/apps/self/self.c b/apps/self/self.c index fa98ab9..3d52881 100644 --- a/apps/self/self.c +++ b/apps/self/self.c @@ -1,32 +1,7 @@ #include "uvm32_target.h" #include "uvm32.h" #include "../common/uvm32_common_custom.h" - -uint8_t rom[] = { // mandel.bin - 0x23, 0x26, 0x11, 0x00, 0xef, 0x00, 0xc0, 0x00, 0xb7, 0x08, 0x00, 0x01, - 0x73, 0x00, 0x00, 0x00, 0x13, 0x01, 0x01, 0xff, 0x23, 0x26, 0x81, 0x00, - 0x37, 0xf5, 0xff, 0xff, 0xb7, 0x15, 0x00, 0x00, 0x37, 0xe6, 0xff, 0xff, - 0x13, 0x07, 0xf0, 0x01, 0xb7, 0x47, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x01, - 0x13, 0x08, 0xd5, 0xcc, 0x93, 0x82, 0x35, 0x33, 0x13, 0x03, 0x76, 0xe6, - 0x93, 0x83, 0x35, 0xb3, 0x13, 0x86, 0x16, 0x00, 0x63, 0xce, 0x02, 0x09, - 0x13, 0x0e, 0x03, 0x00, 0x63, 0xce, 0x63, 0x06, 0x93, 0x0f, 0x00, 0x00, - 0x13, 0x0f, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x93, 0x0e, 0x00, 0x00, - 0x93, 0x06, 0x00, 0x02, 0x13, 0x85, 0x06, 0xfe, 0x63, 0x64, 0xa7, 0x04, - 0x33, 0x05, 0xff, 0x01, 0x63, 0xe0, 0xa7, 0x04, 0x13, 0x05, 0x00, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x06, 0x00, 0xb3, 0x8e, 0x8e, 0x02, - 0x33, 0x0f, 0xff, 0x41, 0x13, 0xd4, 0xbe, 0x40, 0xb3, 0x0e, 0xcf, 0x01, - 0x73, 0x00, 0x00, 0x00, 0x33, 0x04, 0x04, 0x01, 0x33, 0x85, 0xde, 0x03, - 0x13, 0x5f, 0xc5, 0x00, 0x33, 0x05, 0x84, 0x02, 0x93, 0x5f, 0xc5, 0x00, - 0x93, 0x86, 0x16, 0x00, 0x6f, 0xf0, 0x9f, 0xfb, 0x13, 0x85, 0x06, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, - 0x13, 0x0e, 0x1e, 0x09, 0xe3, 0xd6, 0xc3, 0xf9, 0x13, 0x05, 0xa0, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, - 0x13, 0x08, 0x98, 0x19, 0xe3, 0xd6, 0x02, 0xf7, 0x37, 0x05, 0x00, 0x80, - 0x13, 0x05, 0x05, 0x10, 0x93, 0x08, 0x30, 0x00, 0x93, 0x05, 0x00, 0x00, - 0x73, 0x00, 0x00, 0x00, 0x03, 0x24, 0xc1, 0x00, 0x13, 0x01, 0x01, 0x01, - 0x67, 0x80, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, - 0x72, 0x6c, 0x64, 0x00 -}; +#include "mandel.h" void main(void) { uvm32_state_t vmst; @@ -34,7 +9,7 @@ void main(void) { bool isrunning = true; uvm32_init(&vmst); - uvm32_load(&vmst, rom, sizeof(rom)); + uvm32_load(&vmst, mandel, mandel_len); while(isrunning) { uvm32_run(&vmst, &evt, 100); // num instructions before vm considered hung diff --git a/host-mini/Makefile b/host-mini/Makefile index 26b105f..a462722 100644 --- a/host-mini/Makefile +++ b/host-mini/Makefile @@ -1,4 +1,5 @@ all: + xxd -n mandel -i ../precompiled/mandel.bin | sed -e "s/unsigned char/const unsigned char/" > mandel.h gcc -Wall -DUVM32_MEMORY_SIZE=512 -O2 -I../uvm32 -I../common -o host-mini ../uvm32/uvm32.c host-mini.c clean: diff --git a/host-mini/host-mini.c b/host-mini/host-mini.c index a9eb539..9498823 100644 --- a/host-mini/host-mini.c +++ b/host-mini/host-mini.c @@ -3,32 +3,7 @@ #include #include "uvm32.h" #include "../common/uvm32_common_custom.h" - -uint8_t rom[] = { // mandel.bin - 0x23, 0x26, 0x11, 0x00, 0xef, 0x00, 0xc0, 0x00, 0xb7, 0x08, 0x00, 0x01, - 0x73, 0x00, 0x00, 0x00, 0x13, 0x01, 0x01, 0xff, 0x23, 0x26, 0x81, 0x00, - 0x37, 0xf5, 0xff, 0xff, 0xb7, 0x15, 0x00, 0x00, 0x37, 0xe6, 0xff, 0xff, - 0x13, 0x07, 0xf0, 0x01, 0xb7, 0x47, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x01, - 0x13, 0x08, 0xd5, 0xcc, 0x93, 0x82, 0x35, 0x33, 0x13, 0x03, 0x76, 0xe6, - 0x93, 0x83, 0x35, 0xb3, 0x13, 0x86, 0x16, 0x00, 0x63, 0xce, 0x02, 0x09, - 0x13, 0x0e, 0x03, 0x00, 0x63, 0xce, 0x63, 0x06, 0x93, 0x0f, 0x00, 0x00, - 0x13, 0x0f, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x93, 0x0e, 0x00, 0x00, - 0x93, 0x06, 0x00, 0x02, 0x13, 0x85, 0x06, 0xfe, 0x63, 0x64, 0xa7, 0x04, - 0x33, 0x05, 0xff, 0x01, 0x63, 0xe0, 0xa7, 0x04, 0x13, 0x05, 0x00, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x06, 0x00, 0xb3, 0x8e, 0x8e, 0x02, - 0x33, 0x0f, 0xff, 0x41, 0x13, 0xd4, 0xbe, 0x40, 0xb3, 0x0e, 0xcf, 0x01, - 0x73, 0x00, 0x00, 0x00, 0x33, 0x04, 0x04, 0x01, 0x33, 0x85, 0xde, 0x03, - 0x13, 0x5f, 0xc5, 0x00, 0x33, 0x05, 0x84, 0x02, 0x93, 0x5f, 0xc5, 0x00, - 0x93, 0x86, 0x16, 0x00, 0x6f, 0xf0, 0x9f, 0xfb, 0x13, 0x85, 0x06, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, - 0x13, 0x0e, 0x1e, 0x09, 0xe3, 0xd6, 0xc3, 0xf9, 0x13, 0x05, 0xa0, 0x00, - 0x93, 0x05, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, - 0x13, 0x08, 0x98, 0x19, 0xe3, 0xd6, 0x02, 0xf7, 0x37, 0x05, 0x00, 0x80, - 0x13, 0x05, 0x05, 0x10, 0x93, 0x08, 0x30, 0x00, 0x93, 0x05, 0x00, 0x00, - 0x73, 0x00, 0x00, 0x00, 0x03, 0x24, 0xc1, 0x00, 0x13, 0x01, 0x01, 0x01, - 0x67, 0x80, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, - 0x72, 0x6c, 0x64, 0x00 -}; +#include "mandel.h" int main(int argc, char *argv[]) { uvm32_state_t vmst; @@ -36,7 +11,7 @@ int main(int argc, char *argv[]) { bool isrunning = true; uvm32_init(&vmst); - uvm32_load(&vmst, rom, sizeof(rom)); + uvm32_load(&vmst, mandel, mandel_len); while(isrunning) { uvm32_run(&vmst, &evt, 100); // num instructions before vm considered hung diff --git a/host-mini/mandel.h b/host-mini/mandel.h new file mode 100644 index 0000000..21f8d81 --- /dev/null +++ b/host-mini/mandel.h @@ -0,0 +1,28 @@ +const unsigned char mandel[] = { + 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x05, 0x13, 0xb7, 0x08, 0x00, 0x01, + 0x93, 0x88, 0x28, 0x00, 0x73, 0x00, 0x00, 0x00, 0x23, 0x26, 0x11, 0x00, + 0xef, 0x00, 0xc0, 0x00, 0xb7, 0x08, 0x00, 0x01, 0x73, 0x00, 0x00, 0x00, + 0x13, 0x01, 0x01, 0xff, 0x23, 0x26, 0x81, 0x00, 0x37, 0xf5, 0xff, 0xff, + 0xb7, 0x15, 0x00, 0x00, 0x37, 0xe6, 0xff, 0xff, 0x13, 0x07, 0xf0, 0x01, + 0xb7, 0x47, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x01, 0x13, 0x08, 0xd5, 0xcc, + 0x93, 0x82, 0x35, 0x33, 0x13, 0x03, 0x76, 0xe6, 0x93, 0x83, 0x35, 0xb3, + 0x13, 0x86, 0x16, 0x00, 0x63, 0xce, 0x02, 0x09, 0x13, 0x0e, 0x03, 0x00, + 0x63, 0xce, 0x63, 0x06, 0x93, 0x0f, 0x00, 0x00, 0x13, 0x0f, 0x00, 0x00, + 0x13, 0x04, 0x00, 0x00, 0x93, 0x0e, 0x00, 0x00, 0x93, 0x06, 0x00, 0x02, + 0x13, 0x85, 0x06, 0xfe, 0x63, 0x64, 0xa7, 0x04, 0x33, 0x05, 0xff, 0x01, + 0x63, 0xe0, 0xa7, 0x04, 0x13, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x06, 0x00, 0xb3, 0x8e, 0x8e, 0x02, 0x33, 0x0f, 0xff, 0x41, + 0x13, 0xd4, 0xbe, 0x40, 0xb3, 0x0e, 0xcf, 0x01, 0x73, 0x00, 0x00, 0x00, + 0x33, 0x04, 0x04, 0x01, 0x33, 0x85, 0xde, 0x03, 0x13, 0x5f, 0xc5, 0x00, + 0x33, 0x05, 0x84, 0x02, 0x93, 0x5f, 0xc5, 0x00, 0x93, 0x86, 0x16, 0x00, + 0x6f, 0xf0, 0x9f, 0xfb, 0x13, 0x85, 0x06, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x0e, 0x1e, 0x09, + 0xe3, 0xd6, 0xc3, 0xf9, 0x13, 0x05, 0xa0, 0x00, 0x93, 0x05, 0x00, 0x00, + 0x93, 0x08, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x13, 0x08, 0x98, 0x19, + 0xe3, 0xd6, 0x02, 0xf7, 0x37, 0x05, 0x00, 0x80, 0x13, 0x05, 0x05, 0x12, + 0x93, 0x08, 0x30, 0x00, 0x93, 0x05, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x03, 0x24, 0xc1, 0x00, 0x13, 0x01, 0x01, 0x01, 0x67, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x00 +}; +unsigned int mandel_len = 300; diff --git a/precompiled/maze.bin b/precompiled/maze.bin index 326826ee5256f6d8162ce34cd016b84d451acccb..bd2a26e4c9c3cee755f3601db3f312b9fc442d57 100755 GIT binary patch literal 1540 zcmcIkPiP!f82{e9oqf9^*78`l5z*?)W|CD(>re(Sk~x&nqlZ}HA={9HRL~wI^w?de zn@Kz<@=+H-Fe)*u2M<1EthWfIY{7$vWl5pL5<-ZVL}YifZOQt**C{YKB3+lvCM~y$v)z~SnMnkS%c#UJ$1-x1UT*}SKT&^Os*;#p{@)>^c&8zZ> zccv2us**E?930F%2{LmW@W@HvP3OF>Z_~GDK<9TEb_Sqt1PpgaK*s^6wMkw79(278 zs=5Hd!h2KF?cVm?CiwXchHnf2H!gv0(YW2A_pdqnW|`qk7vu%1(Q1Nxs{m@{i}S=E z)Hnmu0)D;B{pBwBEsx>3UBaZX-4C(7&2*dq_5;FCCb8j>-rtxOzY~YEoPRAq&Mbg` zwh4Hl&DDvJsg*vhzry8)d43J>*EZMj8u(|rfHT{cgKo6Ayfp}YcZSxcLitG%v>>hV zz+#yCQBwe)s4?ID4)pa^;(3Z{6R!@{xIvuSgk!nUw<$OC9bXj?m54|AbJCeWH{{WERK#3Xj}t+ zQviyS&OF>b7J1?Si}AR@sHGSOsg9o2AxVefZ8<;Ckukcg4$@|H{UaTZ-F-Up)*oT4 z8n29Jq_bE6z1SnKdPC!z@x~WP>Q(;{MuB{e$y4jq&g28HIuNx|udWQ7==eJ4qct8; zR`>+t(ZssL%QYt|hYn>f^JW$3EPEjqC#V+fx2@%ce*LSo-Wp{W993O|i~G<00 z^sdFtpAIQAOjR#Yw(o!%{TcT5H-Ah7Wp7c;+Hpx#OrCA7O}=T3d+QL5)!<=9O$X5y^Q;r zt!Fy-&0d?{O8s$;_I`-j-sQkk%JgEYH-aJyQUounl^r^JQ?T`E?+{(;m-L>=o~*m@ iWv+K@Z@;oi=gRbKM*Gqm(vMm=F!PuG9?s30ng0P1dkcpE literal 1492 zcma)6O=uHA82$DylY?N(qPc15q)Dlz6msy|L!fsN1+DdvLr>C!hh9^5?TXg{ix=BN zX}t-ykZXlt5j=Ph3nI3X!g>%ABs8VnY<=JE#x!jTE`*uP&V28E@4eZ~H6q)xjw)%= z)bmk#N<=a@NOdaTT>d$;lVnw%0n9V+TR)wTR9nI6822;1~%`57&yIvaul^RlHkIly`rnAX>z0 z@{K>kql0&h9pUb_fKv?%)A6YM3~h=Q`t7`5IQM?nKs}w$U>_Mg;%s+6^N!ap(d3l1 zh9<15R>?r8rOYd3P3p`IXJ+e-mESgWg`R{y*$b^-pB+yauXL{gPHtGb)6kid5}(b| zCm;M=o@=EKK71OWc`9QBW`Dm7$W17jVzSf3_i!$Z&2K<2&#a`Yf@Hg-skH3KCkBkksi(&)Qp z3oFu3ArG5#@L{4E#QnH|odG^D;2&}st+$ovuETS3a@@NcsFyi#JtVox8dQ7tA!ED_ z{-NT0C0^I28b>l~B9l|sW8J#788hkgVWdOCLoH{xex!pOZgPGj{Igt>b2Asux$(In zWNpO6y()(F#@6(et=RzKZ~QTER2ZtP&6nAA%*TIv7c5NQQp3+SUSMlSB7 zqa*iUNx{>lRNOzbb=X_(9rMd_(CzE-H;1+1d!Fs+G)cAZ{x8mYl6Mn%H<5R%f8N;} zO2;0N1>G;v$GxDB1AXiizE#M*Z4uQQH{V_4vv1bE`p3~eYc<)o@;1&1f1j8)WA1CU zAO7JP-siu2J$D?QZYyg5^#*{u_Ypb&ll0qjzahiFN5f3V&q!AIKR>6*!}HD>kADFv CBKv3n diff --git a/precompiled/self.bin b/precompiled/self.bin index f01a5308dec854be2166e7fb493a8dea1a7e45e2..46ba41c40172aee8daf70016664225a071a9803b 100755 GIT binary patch literal 5780 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