From: Bernhard Urban Date: Tue, 11 Jan 2011 23:59:28 +0000 (+0100) Subject: progs: Makefile fun und eine Art "Library" (dt_inc.s) X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=commitdiff_plain;h=3a7211a07ff55b35ed62d183e5c856d0c8e081ce progs: Makefile fun und eine Art "Library" (dt_inc.s) --- diff --git a/3b_sim/.gitignore b/3b_sim/.gitignore index e260184..8e5eafb 100644 --- a/3b_sim/.gitignore +++ b/3b_sim/.gitignore @@ -1,5 +1,6 @@ *.o *.so *.d +*.d.* *.dthex sim diff --git a/progs/.gitignore b/progs/.gitignore new file mode 100644 index 0000000..7cc478c --- /dev/null +++ b/progs/.gitignore @@ -0,0 +1,2 @@ +*.s_prae +*.dthex diff --git a/progs/Makefile b/progs/Makefile new file mode 100644 index 0000000..8d2675b --- /dev/null +++ b/progs/Makefile @@ -0,0 +1,31 @@ +SHELL := bash + +HN := $(shell hostname) +TILABHOSTS := $(shell echo ti{1..41}) apps1 + +ifeq ($(findstring $(HN), $(TILABHOSTS)), $(HN)) +DPROGFLAGS := -d /dev/ttyS0 -b 9600 +else +# TODO: passt das fuern stefan auch? +DPROGFLAGS := -d /dev/ttyUSB0 -b 115200 +endif + +all: fibmmem.prog + +%.s_pre: %.s dt_inc.s + @echo " PRE $<" + gcc -x c -E -C -P $< > $@ + +%.dthex: %.s_pre + @echo " ASM $<" + ../3a_asm/dtas < $< > $@ + +# no real file +fibmmem.prog: +%.prog: %.dthex + @echo " PROG $<" + ../tools/dtprog.py $< $(DPROGFLAGS) + +.PHONY: clean +clean: + rm -rf *.dthex *.s_pre diff --git a/progs/dt_inc.s b/progs/dt_inc.s new file mode 100644 index 0000000..39b8c31 --- /dev/null +++ b/progs/dt_inc.s @@ -0,0 +1,94 @@ +.data + +; TODO +.org 0x300 +int2hex: + ;3210 + .fill 0x33323130 + ;7654 + .fill 0x37363534 + ;ba98 + .fill 0x62613938 + ;fedc + .fill 0x66656463 +.text +; TODO +.org 0x300 + .define UART_BASE, 0x2000 + .define UART_STATUS, 0x0 + .define UART_RECV, 0xc + .define UART_TRANS, 0x8 + + .define UART_TRANS_EMPTY, 0x1 + .define UART_RECV_NEW, 0x2 + +u_recv_byte: + ldw r3, UART_STATUS(r10) + andx r3, UART_RECV_NEW + brzs+ u_recv_byte; branch if zero + xor r0, r0, r0 + ldw r0, UART_RECV(r10) + ret + +u_send_byte: + ldw r9, UART_STATUS(r10) + andx r9, UART_TRANS_EMPTY + brnz+ u_send_byte ; branch if not zero + stb r1, UART_TRANS(r10) + ret + +u_send_uint: + addi r8, r1, 0 + ;usb_sendbuffersafe ("0x", 2); + xor r1, r1, r1 + ldi r1, 0x30 + call u_send_byte + xor r1, r1, r1 + ldi r1, 0x78 + call u_send_byte + ;j = 0 + xor r7, r7, r7 + xor r6, r6, r6 + ldi r6, int2hex@lo + ldih r6, int2hex@hi +u_send_uint_loop: + ;for (j = 0; j < 8; ++j) { + cmpi r7, 8 + reteq + ;usb_sendbuffersafe (&int2hex[(i >> 28) & 0xf], 1); + lrs r1, r8, 28 + andx r1, 0xf + add r9, r6, r1 + ldb r1, 0(r9) + call u_send_byte + ;i <<= 4; + lls r8, r8, 4 + addi r7, r7, 1 + br u_send_uint_loop + +u_send_string: + ; r1 = addr + ; r2 = len + addi r3, r1, 0 +u_send_string_int: + cmpi r2, 0 + reteq- + ldb r1, 0(r3) + call u_send_byte + addis r2, r2, 0-1 + addi r3, r3, 1 + br u_send_string_int + +u_send_newline: + xor r1, r1, r1 + ldi r1, 0x0a + call u_send_byte + ldi r1, 0x0d + call u_send_byte + ret + +u_init: + xor r10, r10, r10 + ldi r10, UART_BASE@lo + ldih r10, UART_BASE@hi + ret diff --git a/progs/fibmmem.s b/progs/fibmmem.s new file mode 100644 index 0000000..0813886 --- /dev/null +++ b/progs/fibmmem.s @@ -0,0 +1,76 @@ +#include "dt_inc.s" + +.data +.org 0x0 +list: + .fill 0x1 ;1. element = 1 ;0x10 + .fill 0x1 ;2. element = 1 ;0x14 + .fill 0x10, 0x0 ;nullen.. +str: + .ascii "hier das ergebnis: " +.text +.org 0x0 +start: + br+ main + br+ main + ret +main: + call+ u_init + call+ u_recv_byte + call u_send_newline + + ldi r1, 9; + ldi r10, list@lo ; global pointer + ldih r10, list@hi + call+ fibcall; + + push r0 + call u_init ; weil r10 ueberschrieben wird + ldis r1, str + ldih r1, str + ldis r2, 19 + call u_send_string + + pop r1 + call+ u_send_uint + call u_send_newline + +hang: + br hang + + ; fib(n) { + ; if (list[n] > 0) { + ; return list[n] + ; } + ; a = fib(n-1) + ; list[n] = a + list[n-2] + ; return list[n] + ; } +fibcall: + ;update counter for aligned access + lls r1, r1, 2 ; *4 + ;calculate adress of top element + add r2, r10, r1 +fibmem: + ;load top element + ldw r0, 0(r2) + ;compare if set + cmpi r0, 0 + ;return if set + retnz- + ;decrement adress for next lopp + subi r2, r2, 4 + ;iterative call for n-1 element + call+ fibmem + ;load n-2 element + ldw r3, 0-4(r2) + ;add n-1 and n-2 element + add r0, r3, r0 + ;increment address for n element + ;is needed because after return + ;we need r2 to be set to the address + ;of element n + addi r2, r2, 4 + ;store fib n + stw r0, 0(r2) + ret+